Load packages to be used in the analysis


ipak <- function(pkg){
  new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
  if (length(new.pkg)) 
    install.packages(new.pkg, dependencies = TRUE)
  sapply(pkg, require, character.only = TRUE)
}

packages <- c("tidyverse", "readxl", "RODBC", "here", "rnaturalearth", "rnaturalearthdata", "maps", "mapdata", "marmap", "rgdal")

ipak(packages)
        tidyverse            readxl             RODBC              here     rnaturalearth 
             TRUE              TRUE              TRUE              TRUE              TRUE 
rnaturalearthdata              maps           mapdata            marmap             rgdal 
             TRUE              TRUE              TRUE              TRUE              TRUE 

Read in the EMA data files


BASIS_Zoo_1999_2004 <- read_xlsx (here("Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_1999_2004.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))


BASIS_Zoo_2005_2009 <- read_xlsx (here("Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2005_2009.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

BASIS_Zoo_2010_2013 <- read_xlsx (here("Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2010_2013.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

BASIS_Zoo_2014_2017 <- read_xlsx (here("Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2014_2017_LonCorrected.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

EMA_Combined <- rbind(BASIS_Zoo_1999_2004, BASIS_Zoo_2005_2009, BASIS_Zoo_2010_2013, BASIS_Zoo_2014_2017)

rm(BASIS_Zoo_1999_2004, BASIS_Zoo_2005_2009, BASIS_Zoo_2010_2013, BASIS_Zoo_2014_2017)

Convert EMA fields into EcoDAAT fields


#Create DAY, MONTH, YEAR columns from "HaulDate"

EMA_Combined_Recode <-  EMA_Combined

EMA_Combined_Recode <- separate(EMA_Combined_Recode, HaulDate, c("YEAR", "MONTH", "DAY"), sep="-")

#Delete year column from the HaulID as there is already a year column

EMA_Combined_Recode$YEAR <- NULL
EMA_Combined_Recode <- rename(EMA_Combined_Recode, YEAR = Year)


#Extract Cruise code 
EMA_Combined_Recode$CRUISE <- substring (EMA_Combined_Recode$StationID, 5,6)

EMA_Combined_Recode$CRUISE_ID <- substring (EMA_Combined_Recode$StationID, 7,8)

#Recod Cruise code with ship ID and 

EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "01"] <- "SS"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "02"] <- "NWE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "03"] <- "DY"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "04"] <- "GP"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "05"] <- "EE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "06"] <- "HE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "07"] <- "LU"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "08"] <- "BE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "09"] <- "AE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "10"] <- "JC"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "11"] <- "ST"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "12"] <- "CH"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "13"] <- "SA"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "14"] <- "QU"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "15"] <- "CF"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "16"] <- "OS"

#Get last two digits of year

EMA_Combined_Recode$CRUISE_YEAR <- substring (EMA_Combined_Recode$YEAR, 3,4)

#Combined CRUISE with 

EMA_Combined_Recode <- unite(EMA_Combined_Recode, "CRUISE", CRUISE, CRUISE_YEAR, sep="")

EMA_Combined_Recode <- unite(EMA_Combined_Recode, "CRUISE", CRUISE, CRUISE_ID, sep = "-")


#Count number of cruises in the EMA dataset

EMA_Combined_Recode_byCRUISE <- group_by(EMA_Combined_Recode, CRUISE)
EMA_Combined_Recode_CruiseCount <- summarise(EMA_Combined_Recode_byCRUISE, n_distinct(YEAR))

ungroup(EMA_Combined_Recode)


#Recode cruises to match nomenclature change in 2013 (i.e., 2DY12 becomes DY13-02 in 2013)

EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="BE11-01"] <- "1BE11"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="BE12-01"] <- "1BE12"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY07-02"] <- "2OD07"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY08-06"] <- "6DY08"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY09-05"] <- "5DY09"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY10-04"] <- "4DY10"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY11-04"] <- "4DY11"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY12-03"] <- "3DY12"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="EE09-01"] <- "1EE09"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="EE10-01"] <- "1EE10"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="GP00-01"] <- "1GP00"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="GP99-01"] <- "1GP99"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="NWE06-01"] <- "1NW06"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS02-01"] <- "1SS02"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS03-01"] <- "1SS03"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS04-01"] <- "1SS04"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS05-01"] <- "1SS05"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS06-01"] <- "1SS06"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS07-01"] <- "1SS07"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="NWE17-05"] <- "NW17-05"

#Remove a few files

rm(EMA_Combined_Recode_byCRUISE, EMA_Combined_Recode_CruiseCount)


#Rename Abundance to EST_NUM_PERM3

EMA_Combined_Recode <- rename(EMA_Combined_Recode, EST_NUM_PERM3 = Abundance)

#Rename GearDepth to MAX_GEAR_DEPTH and use to calculate EST_NUM_PERM3

EMA_Combined_Recode <- rename(EMA_Combined_Recode, MAX_GEAR_DEPTH = GearDepth)

#Compute EST_NUM_PERM2 = EST_NUM_PERM3 * MAX_GEAR_DEPTH

EMA_Combined_Recode$EST_NUM_PERM2 <- EMA_Combined_Recode$EST_NUM_PERM3*EMA_Combined_Recode$MAX_GEAR_DEPTH

#Create columns GEAR_NAME, MESH from GearCode column

EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo153"] <- "20BON_153"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo333"] <- "60BON_333"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo505"] <- "60BON_505"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo80"] <- "80BON_153"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Juday"] <- "Juday_168"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "PairoVET"] <- "PairoVET_153"

EMA_Combined_Recode <- separate(EMA_Combined_Recode, GearCode, c("GEAR_NAME", "MESH"), sep = "_")

#Rename GearInTime to GMT_DATE_TIME_TXT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, GMT_DATE_TIME_TXT = GearInTime)
  
#Rename Quality to HAUL_PERFORMANCE and recode to match EcoDAAT 

EMA_Combined_Recode <- rename(EMA_Combined_Recode, HAUL_PERFORMANCE = Quality)

EMA_Combined_Recode$HAUL_PERFORMANCE[EMA_Combined_Recode$HAUL_PERFORMANCE == "G"] <- "GOOD"
EMA_Combined_Recode$HAUL_PERFORMANCE[EMA_Combined_Recode$HAUL_PERFORMANCE == "Q"] <- "QUEST"

#Create LAT and LON column from GearInLatitude and Gear in Longitude

EMA_Combined_Recode <- rename(EMA_Combined_Recode, LAT = GearInLatitude)

EMA_Combined_Recode <- rename(EMA_Combined_Recode, LON = GearInLongitude)

#Create column SEX_NAME from Sex and recode to match EcoDAAT categories

EMA_Combined_Recode <- rename(EMA_Combined_Recode, SEX_NAME = Sex)

EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "M"] <- "MALE"
EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "F"] <- "FEMALE"
EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "U"] <- "NOT DETERMINED"

#EMA Size categories are numerous, so keep this column, but rename as SIZE_NAME for merging

EMA_Combined_Recode <- rename(EMA_Combined_Recode, SIZE_NAME = Size)

#Create STAGE_NAME category by renaming "StageCode" and recoding

EMA_Combined_Recode <- rename(EMA_Combined_Recode, STAGE_NAME = StageCode)

EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "A"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "A & J"] <- "A + J (ADULT/JUVENILE)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "adult"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Adult"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1"] <- "C - 1 (COPEPODITE I)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-2"] <- "C-1 TO C-2"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-3"] <- "C-1 TO C-3"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-4"] <- "C-1 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-5"] <- "C-1 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-C4"] <- "C-1 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2"] <- "C - 2 (COPEPODITE II)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2-C3"] <- "C-2 TO C-3"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2-C5"] <- "C-2 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3"] <- "C - 3 (COPEPODITE III)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3-C4"] <- "C-3 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3-C5"] <- "C-3 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4"] <- "C - 4 (COPEPODITE IV)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4-C5"] <- "C-4 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4-C6"] <- "C-4 TO C-6"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C5"] <- "C - 5 (COPEPODITE V)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C6"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 1"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 2"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 3"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "cypris"] <- "CYPRIS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Cypris"] <- "CYPRIS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "egg"] <- "EGG"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Egg"] <- "EGG"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "furcilia"] <- "FURCILIA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Furcilia"] <- "FURCILIA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "J"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "juvenile"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Juvenile"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "larva"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Larva"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "larval"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Larval"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "medusa"] <- "MEDUSA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Medusa"] <- "MEDUSA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "megalopa"] <- "MEGALOPAE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Megalopa"] <- "MEGALOPAE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "nauplius"] <- "NAUPLIUS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Nauplius"] <- "NAUPLIUS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "ND"] <- "NOT DETERMINED"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "post-larva"] <- "POST LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "U"] <- "NOT DETERMINED"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "zoea"] <- "ZOEA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Zoea"] <- "ZOEA"

#Create Column STATION_NAME by using the last 3 digits of StationID

EMA_Combined_Recode$STATION_NAME<- substring (EMA_Combined_Recode$StationID, 9,11)

#Create TAXON_NAME column and recode to match EcoDAAT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, TAXON_NAME = Current_Name)

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Acanthomysis sp."] <- "Acanthomysis spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Acanthomysis stelleri"] <- "Acanthomysis stelleri (Exacanthomysis arctopacifica)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Anthoathecatae"] <- "Anthoathecata (Anthomedusae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Cancridae"] <- "Cancridae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Candacia columbiae"] <- "Candacia Columbiae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Caprellidea"] <- "Caprellidae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Clytia gregaria"] <- "Clytia gregaria (Phialidium gregarium)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Cnidaria"] <- "Cnidarian medusae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Corophium spp."] <- "Corophium"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Disacanthomysis dybowskii"] <- "Discanthomysis (Acanthomysis) Dybowskii"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Epilabidocera amphitrites"] <- "Epilabidocera amphitrites (E. longipedata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Epilabidocera longipedata"] <- "Epilabidocera amphitrites (E. longipedata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Euphausia spp."] <- "Euphausiacea"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Eurytemora pacifica"] <- "Eurytemora pacifica (E. johanseni)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Eurytemora sp."] <- "Eurytemora spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Gammaridae"] <- "Gammaridea (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Gammaridea"] <- "Gammaridea (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hippolytidae"] <- "Hippolytidae (Caridea)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hydromedusae (Hydroidolina"] <- "Hydromedusae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Leptothecatae"] <- "Leptothecata (Leptomedusae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Lithodidae"] <- "Lithodidae (Anomura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Majidae"] <- "Majidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Meterythrops robusta"] <- "Meterythrops robustus (M. robusta)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Mysida"] <- "Mysida (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Octopoda"] <- "Octopodiformes (Octopus) larvae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oithona setigera"] <- "Oithona setigera (O. spinirostris)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oithona spinirostris"] <- "Oithona setigera (O. spinirostris)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Chionoecetes spp."] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hyas spp."] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oregoniidae"] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Pacifacanthomysis nephrophthalma"] <- "Pacifacanthomysis (Acanthomysis) nephrophthalma"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Paguridae"] <- "Paguridae (Anomura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Paraeuchaeta elongata"] <- "Paraeuchaeta elongata (Euchaeta elongata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Parasagitta elegans"] <- "Parasagitta (Sagitta) elegans"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Phoronida (actinotroch larva)"] <- "Phoronida actinotroch (larvae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Podon leuckartii"] <- "Podon leuckarti"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Pseudoamallothrix ovata"] <- "Pseudoamallothrix (scolecithricella) ovata"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Syrrhoe"] <- "Syrrhoe spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Tessarabrachion oculatus"] <- "Tessarabrachion oculatum"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Thecosomata"] <- "Thecosomata (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Themisto pacifica"] <- "Themisto pacifica (Parathemisto pacifica)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Triconia sp."] <- "Triconia spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Calanidae"] <- "Unidentified Calanids"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Calanoida"] <- "Unidentified Calanids"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Xenacanthomysis pseudomacropsis"] <- "Xenoacanthomysis (Acanthomysis) pseudomacropsis"



#Create VOLUME_FILTERED column by renaming TowVOlume column

EMA_Combined_Recode <- rename(EMA_Combined_Recode, VOLUME_FILTERED = TowVolume)

#Rename BottomDepth to BOTTOM_DEPTH to match EcoDAAT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, BOTTOM_DEPTH = BottomDepth)


#Rearrange the file to add a column indicating origin of data, to have them in the same order as the EcoDAAT file and remove non-matched columns prior to merge


EMA_Combined_Recode$DATA_SOURCE <- "EMA"

#Inset columns not present in EMA, but will be in EcoDAAT

EMA_Combined_Recode$DIS_PERVOLM2 <- NA
EMA_Combined_Recode$DIS_PERVOLM3 <- NA
EMA_Combined_Recode$FOCI_ID <- NA
EMA_Combined_Recode$FOCI_SAMPLE_ID <- NA
EMA_Combined_Recode$GEOGRAPHIC_AREA <- NA
EMA_Combined_Recode$HAUL_ID <- NA
EMA_Combined_Recode$HAUL_NAME <- NA
EMA_Combined_Recode$MIN_GEAR_DEPTH <- NA
EMA_Combined_Recode$NET <- NA
EMA_Combined_Recode$SAMPLE_DEPTH <- NA
EMA_Combined_Recode$SEX <- NA
EMA_Combined_Recode$SPECIMEN_FORM <- NA
EMA_Combined_Recode$STAGE <- NA
EMA_Combined_Recode$TAXON_SIZE <- NA
EMA_Combined_Recode$ZOOP_COPEPOD_NAUPLII <- NA
EMA_Combined_Recode$ZOOP_EUPHAUSIID_EGG <- NA


#Create HAUL_ID column information for merging purposes

EMA_Combined_Recode$HAUL_ID <- paste0(EMA_Combined_Recode$CRUISE," ",EMA_Combined_Recode$STATION_NAME," ", 1," ", EMA_Combined_Recode$GEAR_NAME," ", 1)


#Create vector of column names from the EcoDAAT File

EcoDAAT_ColumnNames <- c("BOTTOM_DEPTH", "CRUISE", "DAY", "DIS_PERVOLM2", "DIS_PERVOLM3", "EST_NUM_PERM2", "EST_NUM_PERM3", "FOCI_ID", "FOCI_SAMPLE_ID", "GEAR_NAME", "GEOGRAPHIC_AREA", "GMT_DATE_TIME_TXT", "HAUL_ID", "HAUL_NAME", "HAUL_PERFORMANCE", "LAT", "LON", "MAX_GEAR_DEPTH", "MESH", "MIN_GEAR_DEPTH", "MONTH", "NET", "SAMPLE_DEPTH", "SEX", "SEX_NAME", "SIZE_NAME", "SPECIMEN_FORM", "STAGE", "STAGE_NAME", "STATION_NAME", "TAXON_NAME", "TAXON_SIZE", "VOLUME_FILTERED",  "YEAR", "ZOOP_COPEPOD_NAUPLII", "ZOOP_EUPHAUSIID_EGG", "DATA_SOURCE")

EMA_Combined_Recode <- EMA_Combined_Recode[, EcoDAAT_ColumnNames]

Import EcoDAAT data

Connect to database to import zoop data directly from EcoDAAT

#Create connect to the AFSC database

user <- readline("Input Username: ")
kimmeld
pswd <- readline("Input Password: ")
4Calanushyperboreus3!

AFSC_Connect <- odbcConnect("AFSC", uid=user,  pwd=pswd)


#Delete and refresh table to draw from, in this case it is SPECIMEN_MAIN_GEOM

sqlQuery(AFSC_Connect,"DROP TABLE SPECIMEN_MAIN_GEOM;")
character(0)
sqlQuery(AFSC_Connect,"CREATE TABLE SPECIMEN_MAIN_GEOM AS SELECT * FROM ECODAAT.SPECIMEN_MAIN_GEOM;")
character(0)
#Run SQL Queries to build zooplankton dataset 

#Query the database

zoopdata <- sqlQuery(AFSC_Connect, "SELECT BOTTOM_DEPTH,
CRUISE, DAY, DIS_PERVOLM2, DIS_PERVOLM3, EST_NUM_PERM2, EST_NUM_PERM3, FOCI_ID, FOCI_SAMPLE_ID, GEAR_NAME, 
GEOGRAPHIC_AREA, GMT_DATE_TIME_TXT, HAUL_ID, HAUL_NAME, HAUL_PERFORMANCE, LAT, LON, MAX_GEAR_DEPTH, MESH,
MIN_GEAR_DEPTH, MONTH, NET, SAMPLE_DEPTH, SEX, SEX_NAME, SIZE_NAME, SPECIMEN_FORM, STAGE, STAGE_NAME, STATION_NAME,
TAXON_NAME, TAXON_SIZE, VOLUME_FILTERED, YEAR, ZOOP_COPEPOD_NAUPLII, ZOOP_EUPHAUSIID_EGG
FROM SPECIMEN_MAIN_GEOM WHERE ORIG_DB LIKE 'BOB';", stringsAsFactors=FALSE)

#Close database connection

odbcClose(AFSC_Connect)


#Drop one cruise using the old protocol OS17 and replace with correct data

zoopdata <- filter(zoopdata, CRUISE!="OS17-01")

#Bring in OS17-01

OS1701 <- read.csv(here("Raw-Data", "OS1701_EcoFOCI_ZooplanktonNet.csv"))

zoopdata <- rbind(zoopdata, OS1701)

#Delete OS1701

rm(OS1701)

Do some data tidying for the EcoDAAT data set and combine the EcoDAAT and EMA datasets


#Recode mesh sizes for 150, 333, 500

zoopdata$MESH[zoopdata$MESH==150] <- 153
zoopdata$MESH[zoopdata$MESH==154] <- 153
zoopdata$MESH[zoopdata$MESH==1153] <- 153
zoopdata$MESH[zoopdata$MESH==335] <- 333
zoopdata$MESH[zoopdata$MESH==500] <- 505


#Count number of cruises in the EMA dataset

EMA_Combined_Recode_byCRUISE <- group_by(EMA_Combined_Recode, CRUISE)
EMA_Combined_Recode_CruiseCount <- summarise(EMA_Combined_Recode_byCRUISE, n_distinct(YEAR))

ungroup(EMA_Combined_Recode)

#Count number of cruises in the EMA dataset

zoopdata_byCRUISE <- group_by(zoopdata, CRUISE)
zoopdata_CruiseCount <- summarise(zoopdata_byCRUISE, n_distinct(YEAR))

ungroup(zoopdata)



#Do a join to see if cruises have matches in both datasets:

TestData <- semi_join(EMA_Combined_Recode_CruiseCount, zoopdata_CruiseCount, by = "CRUISE")




#10 cruises are present in EMA dataset and zoopdata data set, remove those from the EMA dataset to avoid double counting

EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="1GP99")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="3DY12")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="AE14-01")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="AE15-01")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY14-06")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY14-08")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY15-07")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY15-08")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY16-09")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="NW17-05")

#RemoveFiles

rm(EMA_Combined_Recode_byCRUISE, EMA_Combined_Recode_CruiseCount, zoopdata_byCRUISE, zoopdata_CruiseCount, TestData)

#Combine the EMA and EcoDAAT datasets

#Add Data Source file to the zoopdata prior to combination

zoopdata$DATA_SOURCE <- "EcoDAAT"


#Combine datasets 

AllZoop_Raw <- rbind(EMA_Combined_Recode, zoopdata)



#Create vector of Combined column names to trim dataset for final processing

Combined_ColumnNames <- c("BOTTOM_DEPTH", "CRUISE", "DAY", "DIS_PERVOLM2", "DIS_PERVOLM3", "EST_NUM_PERM2", "EST_NUM_PERM3", "GEAR_NAME", "GMT_DATE_TIME_TXT", "HAUL_ID", "HAUL_PERFORMANCE", "LAT", "LON", "MAX_GEAR_DEPTH", "MESH", "MONTH", "SPECIMEN_FORM", "SEX_NAME", "SIZE_NAME", "STAGE_NAME", "STATION_NAME", "TAXON_NAME", "VOLUME_FILTERED",  "YEAR", "DATA_SOURCE")

#Keep only those columns

AllZoop_Raw <- AllZoop_Raw[,Combined_ColumnNames]

#Remove files

rm (EMA_Combined, EMA_Combined_Recode, zoopdata)

Quick map of the raw data stations


#Quick plot to take a look at the dataset so far

#Get world data from #natural earth package

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)
[1] "sf"         "data.frame"
# get regional polygons
reg = map_data("world2Hires")
reg = subset(reg, region %in% c('USSR', 'USA'))

# convert lat longs
reg$long = (360 - reg$long)*-1

# set map limits
lons = c(-179.5, -130)
lats = c(50, 74)


######################################

# make plot
Region_Map_RawData <- ggplot()+

  # add coastline
  geom_sf(data = world)+
    coord_sf(xlim = lons, ylim = lats, expand = FALSE)+

  #Plot station points
  geom_point(data=AllZoop_Raw, mapping=aes(LON, LAT))+

  # formatting
  theme_bw()+
  xlab("Longitude")+
  ylab("Latitude")

Region_Map_RawData

NA
NA

Data Filtering for BP Synthesis Project


#First filter for all data north of 60N

NBS_Zoop <- filter(AllZoop_Raw, LAT>=60)


#Now map again to take a look

# make plot
Region_Map_NBS_Process_1 <- ggplot()+

  # add coastline
  geom_sf(data = world)+
    coord_sf(xlim = lons, ylim = lats, expand = FALSE)+

  #Plot station points
  geom_point(data=NBS_Zoop, mapping=aes(LON, LAT))+

  # formatting
  theme_bw()+
  xlab("Longitude")+
  ylab("Latitude")

Region_Map_NBS_Process_1



#Looks like some data from the GOA is still present, so remove data > 155

NBS_Zoop <- filter(NBS_Zoop, LON<= -150)

#Now map again to take a look

# make plot
Region_Map_NBS_Process_2 <- ggplot()+

  # add coastline
  geom_sf(data = world)+
    coord_sf(xlim = lons, ylim = lats, expand = FALSE)+

  #Plot station points
  geom_point(data=NBS_Zoop, mapping=aes(LON, LAT))+

  # formatting
  theme_bw()+
  xlab("Longitude")+
  ylab("Latitude")

Region_Map_NBS_Process_2


#Spatial coverage looks correct

#Now check temporal coverage

sort(unique(NBS_Zoop$YEAR), decreasing = FALSE)
 [1] 1996 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
[19] 2019 2020 2021
#Remove data from 1996 as it is removed from all other years of collection

NBS_Zoop <- filter(NBS_Zoop, YEAR!=1996)

#Take a look at the gears present in the dataset

unique(NBS_Zoop$GEAR_NAME)
[1] "60BON"    "Juday"    "PairoVET" "80BON"    "20BON"    "LG-CB"    "SLED"     "V60BON"  
[9] "CALVET"  
unique(NBS_Zoop$MESH)
[1] "505" "333" "168" "153" "53" 
#Rough estimate of number of samples by gear type

NBS_Zoop_Gear <- NBS_Zoop[, c("CRUISE", "GEAR_NAME", "MESH", "LAT", "LON")]

NBS_Zoop_Gear <- distinct(NBS_Zoop_Gear)

NBS_Zoop_Gear_byGear <- group_by(NBS_Zoop_Gear, GEAR_NAME, MESH)

NBS_Gear_Summary <- summarise(NBS_Zoop_Gear_byGear, n())
`summarise()` has grouped output by 'GEAR_NAME'. You can override using the `.groups` argument.
ungroup(NBS_Zoop_Gear)

#This shows a few gears can be eliminated for low sample size (V60BON, 80BON) and CALVET has too small mesh size

NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="CALVET")
NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="V60BON")
NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="80BON")

#Remove sled data as this is biased toward a bottom sample

NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="SLED")



#Remove failed and questionable hauls

#First save the NA since EMA data does not always record HAUL_PERFORMANCE

HaulPerf_NA <- NBS_Zoop[is.na(NBS_Zoop$HAUL_PERFORMANCE),]

NBS_Zoop_GOOD <- filter(NBS_Zoop, HAUL_PERFORMANCE=="GOOD")

#Rebuild dataset without QUEST and FAIL HAULS

NBS_Zoop <- rbind(HaulPerf_NA, NBS_Zoop_GOOD)



#Write this raw file prior to further processing

write.csv(NBS_Zoop, here("Raw-Data", "NBS_Zoop_Raw.csv"))

Bring in the Coarse Taxa List to aid in lumping and filter out some taxa


TaxaList_Coarse <- read.csv(here("Taxa-Lists", "TaxaList_Coarse.csv"))

#Now add this to the file

TaxaList_Coarse <- distinct(TaxaList_Coarse)

NBS_Zoop_Process <- left_join(NBS_Zoop, TaxaList_Coarse, by = "TAXON_NAME")

#Filter out those data marked for removal

NBS_Zoop_Process <- filter(NBS_Zoop_Process, NOTE != "Remove")

Create taxa specific data sets to select the correct stages from the correct GEAR_NAME and MESH for each specific coarse taxa

Acartia spp


Acartia_spp <- filter(NBS_Zoop_Process, TAXA_COARSE=="Acartia spp.")

#Acartia is a small copepod, so all estimates should come from the smaller nets

#Filter for correct gear

Acartia_spp <- filter(Acartia_spp, GEAR_NAME!= "60BON")


#Being to build final data set


NBS_Zoop_Process_Final <- Acartia_spp

Aglantha digitale


Aglantha_digitale <- filter(NBS_Zoop_Process, TAXA_COARSE=="Aglantha digitale")

#Choose to estimate Cnidarians from the 60BON only

Aglantha_digitale <- filter(Aglantha_digitale, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Aglantha_digitale)

Amphipods


Amphipoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Amphipoda")

#Amhipods will be estimated from the 60BON only

Amphipoda <- filter(Amphipoda, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Amphipoda)

Anomura


Anomura <- filter(NBS_Zoop_Process, TAXA_COARSE=="Anomura")

#Anomura estimate from 60BON only

Anomura <- filter(Amphipoda, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Anomura)

Appendicularia


Appendicularia <- filter(NBS_Zoop_Process, TAXA_COARSE=="Appendicularia")

#Can filter for both gears and then add a taxa coarse of Appendicularia_large and Appendicular_small

Appendicularia_large <- filter(Appendicularia, GEAR_NAME=="60BON")

#Recode coarse taxa

Appendicularia_large$TAXA_COARSE[Appendicularia_large$TAXA_COARSE=="Appendicularia"] <- "Appendicularia_large"


Appendicularia_small <- filter(Appendicularia, GEAR_NAME!="60BON")

#Recode coarse taxa

Appendicularia_small$TAXA_COARSE[Appendicularia_small$TAXA_COARSE=="Appendicularia"] <- "Appendicularia_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Appendicularia_large, Appendicularia_small)

Bivalvia


Bivalvia <- filter(NBS_Zoop_Process, TAXA_COARSE=="Bivalvia")

#Bivalvia estimate from smaller nets only

Bivalvia <- filter(Bivalvia, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Bivalvia)

Brachyura


Brachyura <- filter(NBS_Zoop_Process, TAXA_COARSE=="Brachyura")

#Brachyura estimate from 60BON only

Brachyura <- filter(Brachyura, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Brachyura)

Calanus hyperboreus


Calanus_hyperboreus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Calanus hyperboreus")


#Separate EMA data as they were sorted under different protocols

Calanus_hyperboreus_EMA <- filter(Calanus_hyperboreus, DATA_SOURCE=="EMA")
Calanus_hyperboreus_EcoDAAT <- filter(Calanus_hyperboreus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_hyperboreus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_hyperboreus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_hyperboreus_EcoDAAT_FormSummary <- summarise(Calanus_hyperboreus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#These look correct

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_hyperboreus_EMA_byGEAR_NAME <- group_by(Calanus_hyperboreus_EMA, MESH, GEAR_NAME)

Calanus_hyperboreus_EMA_GearSummary <- summarise(Calanus_hyperboreus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Calanus_hyperboreus_EMA <- filter(Calanus_hyperboreus_EMA, MESH != 153)


#The other gears are correct, so rebuild dataset

Calanus_hyperboreus <- rbind(Calanus_hyperboreus_EcoDAAT, Calanus_hyperboreus_EMA)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus_hyperboreus)

Calanus marshallae/glacialis


Calanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Calanus marshallae/glacialis")

#Separate EMA data as they were sorted under different protocols

Calanus_EMA <- filter(Calanus, DATA_SOURCE=="EMA")
Calanus_EcoDAAT <- filter(Calanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_EcoDAAT_FormSummary <- summarise(Calanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Calanus_EcoDAAT_B <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="B")
Calanus_EcoDAAT_B <- filter(Calanus_EcoDAAT_B, MESH!=153)

Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="C")
Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT_C, MESH==153)
Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT_C, GEAR_NAME=="20BON")

Calanus_EcoDAAT_G <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="G")

Calanus_EcoDAAT_H <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="H")

Calanus_EcoDAAT_K <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="K")

Calanus_EcoDAAT_L <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Calanus_EcoDAAT_Final <- rbind(Calanus_EcoDAAT_B, Calanus_EcoDAAT_C, Calanus_EcoDAAT_G, Calanus_EcoDAAT_H, Calanus_EcoDAAT_K, Calanus_EcoDAAT_L)

ungroup(Calanus_EcoDAAT_Final)

#Remove some files

rm(Calanus_EcoDAAT_bySPECIMEN_FORM, Calanus_EcoDAAT_B, Calanus_EcoDAAT_C, Calanus_EcoDAAT_G, Calanus_EcoDAAT_H, Calanus_EcoDAAT_K, Calanus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_EMA_byGEAR_NAME <- group_by(Calanus_EMA, MESH, GEAR_NAME)

Calanus_EMA_GearSummary <- summarise(Calanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Calanus_EMA_60BON <- filter(Calanus_EMA, GEAR_NAME=="60BON")

Calanus_EMA_60BON_333 <- filter(Calanus_EMA_60BON, MESH==333)

Calanus_EMA_60BON_333 <- filter(Calanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Calanus_EMA_60BON_505 <- filter(Calanus_EMA_60BON, MESH==505)

Calanus_EMA_60BON_505 <- filter(Calanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Calanus_EMA_20BON <- filter(Calanus_EMA, GEAR_NAME=="20BON")

Calanus_EMA_20BON_153 <- filter(Calanus_EMA_20BON, MESH==153)

Calanus_EMA_20BON_153 <- filter(Calanus_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Calanus_EMA_Final <- rbind(Calanus_EMA_60BON_333, Calanus_EMA_60BON_505, Calanus_EMA_20BON_153)

ungroup(Calanus_EMA_Final)

#Remove some files

rm(Calanus_EMA_byGEAR_NAME, Calanus_EMA_20BON, Calanus_EMA_20BON_153, Calanus_EMA_60BON, Calanus_EMA_60BON_333, Calanus_EMA_60BON_505)

#Combine into final, Calanus data set

Calanus <- rbind(Calanus_EMA_Final, Calanus_EcoDAAT_Final)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus)

Calanus pacificus


Calanus_pacificus <- filter(NBS_Zoop_Process, TAXA_COARSE == "Calanus pacificus")


#Separate EMA data as they were sorted under different protocols

Calanus_pacificus_EMA <- filter(Calanus_pacificus, DATA_SOURCE=="EMA")
Calanus_pacificus_EcoDAAT <- filter(Calanus_pacificus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_pacificus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_pacificus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_pacificus_EcoDAAT_FormSummary <- summarise(Calanus_pacificus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Stages and gear are correct for EcoDAAT data


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_pacificus_EMA_byGEAR_NAME <- group_by(Calanus_pacificus_EMA, MESH, GEAR_NAME)

Calanus_pacificus_EMA_GearSummary <- summarise(Calanus_pacificus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
# Need to filter for the correct stages for avoid double counts, just remove one Juday sample

Calanus_pacificus_EMA <- filter(Calanus_pacificus_EMA, GEAR_NAME!="Juday")



#Combine into final, Calanus_pacificus data set

Calanus_pacificus <- rbind(Calanus_pacificus_EMA, Calanus_pacificus_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus_pacificus)

Caridea


Caridea <- filter(NBS_Zoop_Process, TAXA_COARSE == "Caridea")

#Caridea estimate from larger nets only

Caridea <- filter(Caridea, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Caridea)

Centropages abdominalis


Centropages <- filter(NBS_Zoop_Process, TAXA_COARSE=="Centropages abdominalis")


#Separate EMA data as they were sorted under different protocols

Centropages_EMA <- filter(Centropages, DATA_SOURCE=="EMA")
Centropages_EcoDAAT <- filter(Centropages, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Centropages_EcoDAAT_bySPECIMEN_FORM <- group_by(Centropages_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Centropages_EcoDAAT_FormSummary <- summarise(Centropages_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Filter for correct GEAR_NAME and MESH from EcoDAAT

Centropages_EcoDAAT <- filter(Centropages_EcoDAAT, SPECIMEN_FORM!="G")


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Centropages_EMA_byGEAR_NAME <- group_by(Centropages_EMA, MESH, GEAR_NAME)

Centropages_EMA_GearSummary <- summarise(Centropages_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#For consistency, select the smaller gear only

Centropages_EMA <- filter(Centropages_EMA, GEAR_NAME!="60BON")


#Recombined data

Centropages <- rbind(Centropages_EcoDAAT, Centropages_EMA)



#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Centropages)

Chaetognatha


Chaetognatha <- filter(NBS_Zoop_Process, TAXA_COARSE=="Chaetognatha")

#Filter for Chaetognatha from the 60BON nets only

Chaetognatha <- filter(Chaetognatha, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Chaetognatha)

Cirripedia


Cirripedia <- filter(NBS_Zoop_Process, TAXA_COARSE == "Cirripedia")

#Can filter for both gears and then add a taxa coarse of Cirripedia_large and Cirripedia_small

Cirripedia_large <- filter(Cirripedia, GEAR_NAME=="60BON")

#Recode coarse taxa

Cirripedia_large$TAXA_COARSE[Cirripedia_large$TAXA_COARSE=="Cirripedia"] <- "Cirripedia_large"


Cirripedia_small <- filter(Cirripedia, GEAR_NAME!="60BON")

#Recode coarse taxa

Cirripedia_small$TAXA_COARSE[Cirripedia_small$TAXA_COARSE=="Cirripedia"] <- "Cirripedia_small"

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cirripedia_large, Cirripedia_small)

Cladocera


Cladocera <- filter(NBS_Zoop_Process, TAXA_COARSE=="Cladocera")

#Cladocera fromt he small net only

#Filter for correct gear

Cladocera <- filter(Cladocera, GEAR_NAME!= "60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cladocera)

Clione limacina


Clione <- filter(NBS_Zoop_Process, TAXA_COARSE=="Clione limacina")

#Estimate from the larger net only

Clione <- filter(Clione, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Clione)

Cnidaria


Cnidaria <- filter(NBS_Zoop_Process, TAXA_COARSE == "Cnidaria")

#Can filter for both gears and then add a taxa coarse of Cnidaria_large and Cnidaria_small

Cnidaria_large <- filter(Cnidaria, GEAR_NAME=="60BON")

#Recode coarse taxa

Cnidaria_large$TAXA_COARSE[Cnidaria_large$TAXA_COARSE=="Cnidaria"] <- "Cnidaria_large"


Cnidaria_small <- filter(Cnidaria, GEAR_NAME!="60BON")

#Recode coarse taxa

Cnidaria_small$TAXA_COARSE[Cnidaria_small$TAXA_COARSE=="Cnidaria"] <- "Cnidaria_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cnidaria_large, Cnidaria_small)

Small and large copepods that do not belong to major taxonomic group



Copepod_small <- filter(NBS_Zoop_Process, TAXA_COARSE == "Copepod_small")

#Filter for the smaller mesh gears only

Copepod_small <- filter(Copepod_small, GEAR_NAME!="60BON")

#Now build the large dataset

Copepod_large <- filter(NBS_Zoop_Process, TAXA_COARSE == "Copepod_large")

#Filter for the smaller mesh gears only

Copepod_large <- filter(Copepod_large, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Copepod_large, Copepod_small)

Ctenophora


Ctenophora <- filter(NBS_Zoop_Process, TAXA_COARSE=="Ctenophora")

#Filter for the large net only

Ctenophora <- filter(Ctenophora, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Ctenophora)

Cumacea


Cumacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Cumacea")

#Filter for the large net only

Cumacea <- filter(Cumacea, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cumacea)

Decapoda


Decapoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Decapoda")

#Very few measurements of unidentfied decapods. We can ignore

Echinodermata


Echinodermata <- filter(NBS_Zoop_Process, TAXA_COARSE=="Echinodermata")

#Echinodermata are tiny, filter from small nets only

Echinodermata <- filter(Echinodermata, GEAR_NAME!="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Echinodermata)

Epilabidocera longipedata


Epilabidocera <- filter(NBS_Zoop_Process, TAXA_COARSE=="Epilabidocera longipedata")


#Separate EMA data as they were sorted under different protocols

Epilabidocera_EMA <- filter(Epilabidocera, DATA_SOURCE=="EMA")
Epilabidocera_EcoDAAT <- filter(Epilabidocera, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Epilabidocera_EcoDAAT_bySPECIMEN_FORM <- group_by(Epilabidocera_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Epilabidocera_EcoDAAT_FormSummary <- summarise(Epilabidocera_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Things are correct for the EcoDAAT data, not look at the EMA data


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Epilabidocera_EMA_byGEAR_NAME <- group_by(Epilabidocera_EMA, MESH, GEAR_NAME)

Epilabidocera_EMA_GearSummary <- summarise(Epilabidocera_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Epilabidocera_EMA_60BON <- filter(Epilabidocera_EMA, GEAR_NAME=="60BON")

Epilabidocera_EMA_60BON_333 <- filter(Epilabidocera_EMA_60BON, MESH==333)

Epilabidocera_EMA_60BON_333 <- filter(Epilabidocera_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Epilabidocera_EMA_60BON_505 <- filter(Epilabidocera_EMA_60BON, MESH==505)

Epilabidocera_EMA_60BON_505 <- filter(Epilabidocera_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Epilabidocera_EMA_20BON <- filter(Epilabidocera_EMA, GEAR_NAME=="20BON")

Epilabidocera_EMA_20BON_153 <- filter(Epilabidocera_EMA_20BON, MESH==153)

Epilabidocera_EMA_20BON_153 <- filter(Epilabidocera_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Epilabidocera_EMA_Final <- rbind(Epilabidocera_EMA_60BON_333, Epilabidocera_EMA_60BON_505, Epilabidocera_EMA_20BON_153)

ungroup(Epilabidocera_EMA_Final)

#Remove some files

rm(Epilabidocera_EMA_byGEAR_NAME, Epilabidocera_EMA_20BON, Epilabidocera_EMA_20BON_153, Epilabidocera_EMA_60BON, Epilabidocera_EMA_60BON_333, Epilabidocera_EMA_60BON_505)

#Combine into final, Epilabidocera data set

Epilabidocera <- rbind(Epilabidocera_EMA_Final, Epilabidocera_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Epilabidocera)

Eucalanus bungii


Eucalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Eucalanus bungii")


#Separate EMA data as they were sorted under different protocols

Eucalanus_EMA <- filter(Eucalanus, DATA_SOURCE=="EMA")
Eucalanus_EcoDAAT <- filter(Eucalanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Eucalanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Eucalanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Eucalanus_EcoDAAT_FormSummary <- summarise(Eucalanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Eucalanus_EcoDAAT_A <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="A")
Eucalanus_EcoDAAT_A <- filter(Eucalanus_EcoDAAT_A, MESH!=153)

Eucalanus_EcoDAAT_B <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="B")
Eucalanus_EcoDAAT_B <- filter(Eucalanus_EcoDAAT_B, MESH!=153)

Eucalanus_EcoDAAT_C <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="C")
Eucalanus_EcoDAAT_C <- filter(Eucalanus_EcoDAAT_C, MESH==153)

Eucalanus_EcoDAAT_F <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="F")


Eucalanus_EcoDAAT_G <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="G")

Eucalanus_EcoDAAT_H <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="H")

Eucalanus_EcoDAAT_K <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="K")

Eucalanus_EcoDAAT_L <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Eucalanus_EcoDAAT_Final <- rbind(Eucalanus_EcoDAAT_A, Eucalanus_EcoDAAT_B, Eucalanus_EcoDAAT_C, Eucalanus_EcoDAAT_F,  Eucalanus_EcoDAAT_G, Eucalanus_EcoDAAT_H, Eucalanus_EcoDAAT_K, Eucalanus_EcoDAAT_L)

ungroup(Eucalanus_EcoDAAT_Final)

#Remove some files

rm(Eucalanus_EcoDAAT_bySPECIMEN_FORM, Eucalanus_EcoDAAT_A, Eucalanus_EcoDAAT_B, Eucalanus_EcoDAAT_C, Eucalanus_EcoDAAT_F, Eucalanus_EcoDAAT_G, Eucalanus_EcoDAAT_H, Eucalanus_EcoDAAT_K, Eucalanus_EcoDAAT_L)



#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Eucalanus_EMA_byGEAR_NAME <- group_by(Eucalanus_EMA, MESH, GEAR_NAME)

Eucalanus_EMA_GearSummary <- summarise(Eucalanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Eucalanus_EMA_60BON <- filter(Eucalanus_EMA, GEAR_NAME=="60BON")

Eucalanus_EMA_60BON_333 <- filter(Eucalanus_EMA_60BON, MESH==333)

Eucalanus_EMA_60BON_333 <- filter(Eucalanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Eucalanus_EMA_60BON_505 <- filter(Eucalanus_EMA_60BON, MESH==505)

Eucalanus_EMA_60BON_505 <- filter(Eucalanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Eucalanus_EMA_20BON <- filter(Eucalanus_EMA, GEAR_NAME=="20BON")

Eucalanus_EMA_20BON_153 <- filter(Eucalanus_EMA_20BON, MESH==153)

Eucalanus_EMA_20BON_153 <- filter(Eucalanus_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Eucalanus_EMA_Final <- rbind(Eucalanus_EMA_60BON_333, Eucalanus_EMA_60BON_505, Eucalanus_EMA_20BON_153)

ungroup(Eucalanus_EMA_Final)

#Remove some files

rm(Eucalanus_EMA_byGEAR_NAME, Eucalanus_EMA_20BON, Eucalanus_EMA_20BON_153, Eucalanus_EMA_60BON, Eucalanus_EMA_60BON_333, Eucalanus_EMA_60BON_505)

#Combine into final, Eucalanus data set

Eucalanus <- rbind(Eucalanus_EMA_Final, Eucalanus_EcoDAAT_Final)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Eucalanus)

Euphausiacea pacifica


E_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Euphausia pacifica")

#Filter for large net only and stages are adult and juvenile

E_pacifica <- filter(E_pacifica, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, E_pacifica)

Euphausiacea


Euphausiacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Euphausiacea")

#First separate out the adults belonging to Tessarbranchion oculatum

    
Tessarabrachion_oculatum <- filter (Euphausiacea, TAXON_NAME=="Tessarabrachion oculatum")


#Now filter the Euphausiacea for the correct stages and nets

Euphausiacea <- filter(Euphausiacea, TAXON_NAME!="Tessarabrachion oculatum")

#Eliminate adult and juvenile stages, those should be identified to species

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!= "A + J (ADULT/JUVENILE)")

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!= "JUVENILE")

#Get rid of the NOT DETERMINED

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!="NOT DETERMINED")

#Get rid of the EGG

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!="EGG")


#Now create the furcilia dataset

Euphausiacea_furcilia <- filter(Euphausiacea, STAGE_NAME=="FURCILIA")

Euphausiacea_furcilia <- filter(Euphausiacea, GEAR_NAME=="60BON")


#Now create the calytopis dataset

Euphausiacea_calyptopis <- filter(Euphausiacea, STAGE_NAME=="CALYPTOPIS (STAGE NOT DETERMINED)"|STAGE_NAME=="CALYPTOPIS 1"|STAGE_NAME=="CALYPTOPIS 2"|STAGE_NAME=="CALYPTOPIS 3")


#Now create the nauplius dataset

Euphausiacea_nauplius <- filter(Euphausiacea, STAGE_NAME=="NAUPLIUS")

#Filter for small nets only

Euphausiacea_nauplius <- filter(Euphausiacea_nauplius, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Euphausiacea_furcilia, Euphausiacea_calyptopis, Euphausiacea_nauplius)

Eurytemora spp.


Eurytemora <- filter(NBS_Zoop_Process, TAXA_COARSE=="Eurytemora spp.")

#Filter from the small nets only

Eurytemora <- filter(Eurytemora, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Eurytemora)

Gastropoda


Gastropoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Gastropoda")

#Unidentified gastropods, can remove from final dataset

Limacina helicina


Limacina <- filter(NBS_Zoop_Process, TAXA_COARSE=="Limacina helicina")

#Can split into estiamtes from large and small nets


Limacina_large <- filter(Limacina, GEAR_NAME=="60BON")

#Rename the coarse taxa

Limacina_large$TAXA_COARSE[Limacina_large$TAXA_COARSE=="Limacina helicina"] <- "Limacina_large"

#Now do the small nets

Limacina_small <- filter(Limacina, GEAR_NAME!="60BON")

#Rename the coarse taxa

Limacina_small$TAXA_COARSE[Limacina_small$TAXA_COARSE=="Limacina helicina"] <- "Limacina_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Limacina_large, Limacina_small)

Metridia longa


Metridia_longa <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia longa")

#Adults, C5 only so all is good, can add to full data set

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_longa)

Metridia okhotensis


Metridia_okhotensis <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia okhotensis")


#Adults, C4, and C5 only so all is good, can add to full data set

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_okhotensis)

Metridia pacifica


Metridia_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia pacifica")


#Separate EMA data as they were sorted under different protocols

Metridia_pacifica_EMA <- filter(Metridia_pacifica, DATA_SOURCE=="EMA")
Metridia_pacifica_EcoDAAT <- filter(Metridia_pacifica, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM <- group_by(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Metridia_pacifica_EcoDAAT_FormSummary <- summarise(Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Metridia_pacifica_EcoDAAT_B <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="B")
Metridia_pacifica_EcoDAAT_B <- filter(Metridia_pacifica_EcoDAAT_B, MESH!=153)

Metridia_pacifica_EcoDAAT_C <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="C")

Metridia_pacifica_EcoDAAT_G <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="G")


Metridia_pacifica_EcoDAAT_H <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="H")

#Remove C3 stage

Metridia_pacifica_EcoDAAT_H <- filter(Metridia_pacifica_EcoDAAT_H, STAGE_NAME!="C - 3 (COPEPODITE III)")


Metridia_pacifica_EcoDAAT_K <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="K")

Metridia_pacifica_EcoDAAT_L <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Metridia_pacifica_EcoDAAT_Final <- rbind(Metridia_pacifica_EcoDAAT_B, Metridia_pacifica_EcoDAAT_C, Metridia_pacifica_EcoDAAT_G, Metridia_pacifica_EcoDAAT_H, Metridia_pacifica_EcoDAAT_K, Metridia_pacifica_EcoDAAT_L)

ungroup(Metridia_pacifica_EcoDAAT_Final)

#Remove some files

rm(Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM, Metridia_pacifica_EcoDAAT_B, Metridia_pacifica_EcoDAAT_C, Metridia_pacifica_EcoDAAT_G, Metridia_pacifica_EcoDAAT_H, Metridia_pacifica_EcoDAAT_K, Metridia_pacifica_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Metridia_pacifica_EMA_byGEAR_NAME <- group_by(Metridia_pacifica_EMA, MESH, GEAR_NAME)

Metridia_pacifica_EMA_GearSummary <- summarise(Metridia_pacifica_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Metridia_pacifica_EMA_60BON <- filter(Metridia_pacifica_EMA, GEAR_NAME=="60BON")

Metridia_pacifica_EMA_60BON_333 <- filter(Metridia_pacifica_EMA_60BON, MESH==333)

Metridia_pacifica_EMA_60BON_333 <- filter(Metridia_pacifica_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Metridia_pacifica_EMA_60BON_505 <- filter(Metridia_pacifica_EMA_60BON, MESH==505)

Metridia_pacifica_EMA_60BON_505 <- filter(Metridia_pacifica_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")



Metridia_pacifica_EMA_smallnets <- filter(Metridia_pacifica_EMA, GEAR_NAME!="60BON")

Metridia_pacifica_EMA_smallnets <- filter(Metridia_pacifica_EMA_smallnets, STAGE_NAME=="C - 1 (COPEPODITE I)"|STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

#Rename Metridia pacific of early stages as Metridia spp.

Metridia_pacifica_EMA_smallnets$TAXA_COARSE[Metridia_pacifica_EMA_smallnets$TAXA_COARSE=="Metridia pacifica"] <- "Metridia spp."

#The other gears are correct, so rebuild dataset

Metridia_pacifica_EMA_Final <- rbind(Metridia_pacifica_EMA_60BON_333, Metridia_pacifica_EMA_60BON_505, Metridia_pacifica_EMA_smallnets)

ungroup(Metridia_pacifica_EMA_Final)

#Remove some files

rm(Metridia_pacifica_EMA_byGEAR_NAME, Metridia_pacifica_EMA_smallnets, Metridia_pacifica_EMA_60BON, Metridia_pacifica_EMA_60BON_333, Metridia_pacifica_EMA_60BON_505)

#Combine into final, Metridia_pacifica data set

Metridia_pacifica <- rbind(Metridia_pacifica_EMA_Final, Metridia_pacifica_EcoDAAT_Final)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_pacifica)

Metridia spp.


Metridia_spp <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia spp.")

#Filter for the small nets only

Metridia_spp <- filter(Metridia_spp, GEAR_NAME!="60BON")

#Now filter out the stages that are accurate for the small nets, anything less than stage C-3

Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C-1 TO C-5")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C3-4")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C3-5")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C - 4 (COPEPODITE IV)")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_spp)

Mysids


Mysidae <- filter(NBS_Zoop_Process, TAXA_COARSE=="Mysidae")

#Filter for 60BON nets only

Mysidae <- filter(Mysidae, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Mysidae)

Neocalanus cristatus


Cristatus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Neocalanus cristatus")


#Separate EMA data as they were sorted under different protocols

Cristatus_EMA <- filter(Cristatus, DATA_SOURCE=="EMA")
Cristatus_EcoDAAT <- filter(Cristatus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Cristatus_EcoDAAT_bySPECIMEN_FORM <- group_by(Cristatus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Cristatus_EcoDAAT_FormSummary <- summarise(Cristatus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Cristatus_EcoDAAT_A <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="A")
Cristatus_EcoDAAT_A <- filter(Cristatus_EcoDAAT_A, MESH!=153)

Cristatus_EcoDAAT_B <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="B")
Cristatus_EcoDAAT_B <- filter(Cristatus_EcoDAAT_B, MESH!=153)

Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="C")
Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT_C, MESH==153)
Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT_C, GEAR_NAME=="20BON")

Cristatus_EcoDAAT_F <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="F")

Cristatus_EcoDAAT_G <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="G")

Cristatus_EcoDAAT_H <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="H")

Cristatus_EcoDAAT_K <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="K")

Cristatus_EcoDAAT_L <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Cristatus_EcoDAAT_Final <- rbind(Cristatus_EcoDAAT_A, Cristatus_EcoDAAT_B, Cristatus_EcoDAAT_C, Cristatus_EcoDAAT_F, Cristatus_EcoDAAT_G, Cristatus_EcoDAAT_H, Cristatus_EcoDAAT_K, Cristatus_EcoDAAT_L)

ungroup(Cristatus_EcoDAAT_Final)

#Remove some files

rm(Cristatus_EcoDAAT_bySPECIMEN_FORM, Cristatus_EcoDAAT_A, Cristatus_EcoDAAT_B, Cristatus_EcoDAAT_C, Cristatus_EcoDAAT_F, Cristatus_EcoDAAT_G, Cristatus_EcoDAAT_H, Cristatus_EcoDAAT_K, Cristatus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Cristatus_EMA_byGEAR_NAME <- group_by(Cristatus_EMA, MESH, GEAR_NAME)

Cristatus_EMA_GearSummary <- summarise(Cristatus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Cristatus_EMA_Final <-  filter(Cristatus_EMA, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")


ungroup(Cristatus_EMA_Final)


#Now combine EMA and EcoDAAT data together

Cristatus_Final <- rbind(Cristatus_EMA_Final, Cristatus_EcoDAAT_Final)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cristatus_Final)

Neocalanus spp.


Neocalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Neocalanus spp.")


#Separate EMA data as they were sorted under different protocols

Neocalanus_EMA <- filter(Neocalanus, DATA_SOURCE=="EMA")
Neocalanus_EcoDAAT <- filter(Neocalanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Neocalanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Neocalanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Neocalanus_EcoDAAT_FormSummary <- summarise(Neocalanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Neocalanus_EcoDAAT_B <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="B")
Neocalanus_EcoDAAT_B <- filter(Neocalanus_EcoDAAT_B, MESH!=153)

Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="C")
Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT_C, MESH==153)
Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT_C, GEAR_NAME=="20BON")

Neocalanus_EcoDAAT_G <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="G")

Neocalanus_EcoDAAT_H <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="H")

Neocalanus_EcoDAAT_K <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="K")

Neocalanus_EcoDAAT_L <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Neocalanus_EcoDAAT_Final <- rbind(Neocalanus_EcoDAAT_B, Neocalanus_EcoDAAT_C, Neocalanus_EcoDAAT_G, Neocalanus_EcoDAAT_H, Neocalanus_EcoDAAT_K, Neocalanus_EcoDAAT_L)

ungroup(Neocalanus_EcoDAAT_Final)

#Remove some files

rm(Neocalanus_EcoDAAT_bySPECIMEN_FORM, Neocalanus_EcoDAAT_B, Neocalanus_EcoDAAT_C, Neocalanus_EcoDAAT_G, Neocalanus_EcoDAAT_H, Neocalanus_EcoDAAT_K, Neocalanus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Neocalanus_EMA_byGEAR_NAME <- group_by(Neocalanus_EMA, MESH, GEAR_NAME)

Neocalanus_EMA_GearSummary <- summarise(Neocalanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Neocalanus_EMA_Final <-  filter(Neocalanus_EMA, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")


ungroup(Neocalanus_EMA_Final)


#NOw combine EMA and EcoDAAT data together

Neocalanus_Final <- rbind(Neocalanus_EMA_Final, Neocalanus_EcoDAAT_Final)

#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Neocalanus_Final)

Oithona spp.


Oithona <- filter(NBS_Zoop_Process, TAXA_COARSE=="Oithona spp.")

#Filter for small nets only

Oithona <- filter(Oithona, GEAR_NAME!="60BON")


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Oithona)

Ostracoda


Ostracoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Ostracoda")

Polychaeta


Polychaeta <- filter(NBS_Zoop_Process, TAXA_COARSE=="Polychaeta")

#Split into small and large estimates from the correct nets and meshes

Polychaeta_large <- filter(Polychaeta, GEAR_NAME=="60BON")


#Rename Polychaeta large

Polychaeta_large$TAXA_COARSE[Polychaeta_large$TAXA_COARSE=="Polychaeta"] <- "Polychaeta_large"


#Now do the small nets

Polychaeta_small <- filter(Polychaeta, GEAR_NAME!="60BON")

#Rename Polychaeta small

Polychaeta_small$TAXA_COARSE[Polychaeta_small$TAXA_COARSE=="Polychaeta"] <- "Polychaeta_small"


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Polychaeta_large, Polychaeta_small)

Pseudocalanus


Pseudocalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Pseudocalanus spp.")

#Filter for the small nets only

Pseudocalanus <- filter(Pseudocalanus, GEAR_NAME!="60BON")


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Pseudocalanus)

Thaliacea


Thaliacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Thaliacea")

Themisto abyssorum


Themisto_abyssorum <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto abyssorum")

Themisto libellula


Themisto_libellula <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto libellula")

#Filter for the 60BON nets only

Themisto_libellula <- filter(Themisto_libellula, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto_libellula)

Themisto pacifica


Themisto_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto pacifica")

#Filter for the 60BON nets only

Themisto_pacifica <- filter(Themisto_pacifica, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto_pacifica)

Themisto spp.


Themisto <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto spp.")

#Filter for the 60BON nets only

Themisto<- filter(Themisto, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto)

Thysanoessa species


Thysanoessa <- filter(NBS_Zoop_Process, TAXA_COARSE=="Thysanoessa inermis"|TAXA_COARSE=="Thysanoessa inspinata"|TAXA_COARSE=="Thysanoessa longipes"|TAXA_COARSE=="Thysanoessa raschii"|TAXA_COARSE=="Thysanoessa spinifera")

#Select for 60BON only

Thysanoessa <- filter(Thysanoessa, GEAR_NAME=="60BON")

#Now the correct stages

Thysanoessa <- filter(Thysanoessa, STAGE_NAME=="A + J (ADULT/JUVENILE)"|STAGE_NAME=="JUVENILE"|STAGE_NAME=="ADULT")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Thysanoessa)

Tortanus discaudatus


Tortanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Tortanus discaudatus")

#Separate EMA data as they were sorted under different protocols

Tortanus_EMA <- filter(Tortanus, DATA_SOURCE=="EMA")
Tortanus_EcoDAAT <- filter(Tortanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Tortanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Tortanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Tortanus_EcoDAAT_FormSummary <- summarise(Tortanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using the
`.groups` argument.
#EcoDAAT data are correctly specified



#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Tortanus_EMA_byGEAR_NAME <- group_by(Tortanus_EMA, MESH, GEAR_NAME)

Tortanus_EMA_GearSummary <- summarise(Tortanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups` argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Tortanus_EMA_60BON <- filter(Tortanus_EMA, GEAR_NAME=="60BON")

Tortanus_EMA_60BON_333 <- filter(Tortanus_EMA_60BON, MESH==333)

Tortanus_EMA_60BON_333 <- filter(Tortanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)")

Tortanus_EMA_60BON_505 <- filter(Tortanus_EMA_60BON, MESH==505)

Tortanus_EMA_60BON_505 <- filter(Tortanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)")



Tortanus_EMA_smallnets <- filter(Tortanus_EMA, GEAR_NAME!="60BON")


Tortanus_EMA_smallnets <- filter(Tortanus_EMA_smallnets, STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)"|STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Tortanus_EMA_Final <- rbind(Tortanus_EMA_60BON_333, Tortanus_EMA_60BON_505, Tortanus_EMA_smallnets)

ungroup(Tortanus_EMA_Final)

#Remove some files

rm(Tortanus_EMA_byGEAR_NAME,  Tortanus_EMA_smallnets, Tortanus_EMA_60BON, Tortanus_EMA_60BON_333, Tortanus_EMA_60BON_505)

#Combine into final, Tortanus data set

Tortanus <- rbind(Tortanus_EMA_Final, Tortanus_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Tortanus)

Now do biomass conversions


#NOw read in the biomass conversion data set

Biomass_annotated <- read_xlsx(here("Biomass", "Biomass-Annotated.xlsx"))

#Merge the two data sets based on TAXA_COARSE, STAGE_NAME, SEX_NAME

NBS_Zoop_Process_Final <- left_join(NBS_Zoop_Process_Final, Biomass_annotated, by = c("TAXA_COARSE", "STAGE_NAME", "SEX_NAME"))

#Do some tidying to eliminate some columns

NBS_Zoop_Process_Final$NOTE <- NULL
NBS_Zoop_Process_Final$IND_WW_MG_NOTE <- NULL
NBS_Zoop_Process_Final$IND_DW_MG_CONVERTED_NOTE <- NULL
NBS_Zoop_Process_Final$IND_C_MG_CONVERTED_NOTE <- NULL
NBS_Zoop_Process_Final$GROWTH_RATE_NOTE <- NULL


#Create wet weight biomass column converted individual wet weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_WW_MG_M3_MEAN = IND_WW_MG_MEASURED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_WW_MG_M3_SD = IND_WW_MG_MEASURED_SD*EST_NUM_PERM3)


#Create dry weight biomass column converted individual dry weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_DW_MG_M3_MEAN = IND_DW_MG_CONVERTED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_DW_MG_M3_SD = IND_DW_MG_CONVERTED_SD*EST_NUM_PERM3)


#Create carbon weight biomass column converted individual carbon weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_C_MG_M3_MEAN = IND_C_MG_CONVERTED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_C_MG_M3_SD = IND_C_MG_CONVERTED_SD*EST_NUM_PERM3)


#Create carbon weight biomass column converted individual carbon weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, PRODUCTION_MG_C_D_MEAN = (IND_C_MG_CONVERTED_MEAN*EST_NUM_PERM3*GROWTH_RATE_MEAN)*24)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, PRODUCTION_MG_C_D_SD = (IND_C_MG_CONVERTED_SD*EST_NUM_PERM3*GROWTH_RATE_SD)*24)

Now write processed dataset after adding biomass information



write.csv(NBS_Zoop_Process_Final, here("Processed-Data", "NBS_Zoop_Process_Final.csv"), row.names = FALSE)
LS0tDQp0aXRsZTogIkJQIFN5bnRoZXNpcyBEYXRhIFNldCBDb25zdHJ1Y3Rpb24iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCkxvYWQgcGFja2FnZXMgdG8gYmUgdXNlZCBpbiB0aGUgYW5hbHlzaXMNCg0KYGBge3J9DQoNCmlwYWsgPC0gZnVuY3Rpb24ocGtnKXsNCiAgbmV3LnBrZyA8LSBwa2dbIShwa2cgJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssICJQYWNrYWdlIl0pXQ0KICBpZiAobGVuZ3RoKG5ldy5wa2cpKSANCiAgICBpbnN0YWxsLnBhY2thZ2VzKG5ldy5wa2csIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogIHNhcHBseShwa2csIHJlcXVpcmUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCn0NCg0KcGFja2FnZXMgPC0gYygidGlkeXZlcnNlIiwgInJlYWR4bCIsICJST0RCQyIsICJoZXJlIiwgInJuYXR1cmFsZWFydGgiLCAicm5hdHVyYWxlYXJ0aGRhdGEiLCAibWFwcyIsICJtYXBkYXRhIiwgIm1hcm1hcCIsICJyZ2RhbCIpDQoNCmlwYWsocGFja2FnZXMpDQoNCmBgYA0KDQpSZWFkIGluIHRoZSBFTUEgZGF0YSBmaWxlcw0KDQpgYGB7cn0NCg0KQkFTSVNfWm9vXzE5OTlfMjAwNCA8LSByZWFkX3hsc3ggKGhlcmUoIlJhdy1EYXRhIiwgIkVNQS1IaXN0b3JpY2FsLURhdGEiLCAiQkFTSVNfWm9vXzE5OTlfMjAwNC54bHN4IiksIGNvbF90eXBlcyA9IGMoInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgImRhdGUiLCAiZGF0ZSIsICJkYXRlIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkNCg0KDQpCQVNJU19ab29fMjAwNV8yMDA5IDwtIHJlYWRfeGxzeCAoaGVyZSgiUmF3LURhdGEiLCAiRU1BLUhpc3RvcmljYWwtRGF0YSIsICJCQVNJU19ab29fMjAwNV8yMDA5Lnhsc3giKSwgY29sX3R5cGVzID0gYygidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAiZGF0ZSIsICJkYXRlIiwgImRhdGUiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKQ0KDQpCQVNJU19ab29fMjAxMF8yMDEzIDwtIHJlYWRfeGxzeCAoaGVyZSgiUmF3LURhdGEiLCAiRU1BLUhpc3RvcmljYWwtRGF0YSIsICJCQVNJU19ab29fMjAxMF8yMDEzLnhsc3giKSwgY29sX3R5cGVzID0gYygidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAiZGF0ZSIsICJkYXRlIiwgImRhdGUiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKQ0KDQpCQVNJU19ab29fMjAxNF8yMDE3IDwtIHJlYWRfeGxzeCAoaGVyZSgiUmF3LURhdGEiLCAiRU1BLUhpc3RvcmljYWwtRGF0YSIsICJCQVNJU19ab29fMjAxNF8yMDE3X0xvbkNvcnJlY3RlZC54bHN4IiksIGNvbF90eXBlcyA9IGMoInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgImRhdGUiLCAiZGF0ZSIsICJkYXRlIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkNCg0KRU1BX0NvbWJpbmVkIDwtIHJiaW5kKEJBU0lTX1pvb18xOTk5XzIwMDQsIEJBU0lTX1pvb18yMDA1XzIwMDksIEJBU0lTX1pvb18yMDEwXzIwMTMsIEJBU0lTX1pvb18yMDE0XzIwMTcpDQoNCnJtKEJBU0lTX1pvb18xOTk5XzIwMDQsIEJBU0lTX1pvb18yMDA1XzIwMDksIEJBU0lTX1pvb18yMDEwXzIwMTMsIEJBU0lTX1pvb18yMDE0XzIwMTcpDQoNCmBgYA0KDQoNCg0KQ29udmVydCBFTUEgZmllbGRzIGludG8gRWNvREFBVCBmaWVsZHMNCg0KYGBge3J9DQoNCiNDcmVhdGUgREFZLCBNT05USCwgWUVBUiBjb2x1bW5zIGZyb20gIkhhdWxEYXRlIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtICBFTUFfQ29tYmluZWQNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBzZXBhcmF0ZShFTUFfQ29tYmluZWRfUmVjb2RlLCBIYXVsRGF0ZSwgYygiWUVBUiIsICJNT05USCIsICJEQVkiKSwgc2VwPSItIikNCg0KI0RlbGV0ZSB5ZWFyIGNvbHVtbiBmcm9tIHRoZSBIYXVsSUQgYXMgdGhlcmUgaXMgYWxyZWFkeSBhIHllYXIgY29sdW1uDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkWUVBUiA8LSBOVUxMDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBZRUFSID0gWWVhcikNCg0KDQojRXh0cmFjdCBDcnVpc2UgY29kZSANCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFIDwtIHN1YnN0cmluZyAoRU1BX0NvbWJpbmVkX1JlY29kZSRTdGF0aW9uSUQsIDUsNikNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VfSUQgPC0gc3Vic3RyaW5nIChFTUFfQ29tYmluZWRfUmVjb2RlJFN0YXRpb25JRCwgNyw4KQ0KDQojUmVjb2QgQ3J1aXNlIGNvZGUgd2l0aCBzaGlwIElEIGFuZCANCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjAxIl0gPC0gIlNTIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjAyIl0gPC0gIk5XRSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwMyJdIDwtICJEWSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwNCJdIDwtICJHUCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwNSJdIDwtICJFRSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwNiJdIDwtICJIRSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwNyJdIDwtICJMVSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwOCJdIDwtICJCRSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwOSJdIDwtICJBRSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxMCJdIDwtICJKQyINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxMSJdIDwtICJTVCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxMiJdIDwtICJDSCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxMyJdIDwtICJTQSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxNCJdIDwtICJRVSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxNSJdIDwtICJDRiINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxNiJdIDwtICJPUyINCg0KI0dldCBsYXN0IHR3byBkaWdpdHMgb2YgeWVhcg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRV9ZRUFSIDwtIHN1YnN0cmluZyAoRU1BX0NvbWJpbmVkX1JlY29kZSRZRUFSLCAzLDQpDQoNCiNDb21iaW5lZCBDUlVJU0Ugd2l0aCANCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSB1bml0ZShFTUFfQ29tYmluZWRfUmVjb2RlLCAiQ1JVSVNFIiwgQ1JVSVNFLCBDUlVJU0VfWUVBUiwgc2VwPSIiKQ0KDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHVuaXRlKEVNQV9Db21iaW5lZF9SZWNvZGUsICJDUlVJU0UiLCBDUlVJU0UsIENSVUlTRV9JRCwgc2VwID0gIi0iKQ0KDQoNCiNDb3VudCBudW1iZXIgb2YgY3J1aXNlcyBpbiB0aGUgRU1BIGRhdGFzZXQNCg0KRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSA8LSBncm91cF9ieShFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UpDQpFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50IDwtIHN1bW1hcmlzZShFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFLCBuX2Rpc3RpbmN0KFlFQVIpKQ0KDQp1bmdyb3VwKEVNQV9Db21iaW5lZF9SZWNvZGUpDQoNCg0KI1JlY29kZSBjcnVpc2VzIHRvIG1hdGNoIG5vbWVuY2xhdHVyZSBjaGFuZ2UgaW4gMjAxMyAoaS5lLiwgMkRZMTIgYmVjb21lcyBEWTEzLTAyIGluIDIwMTMpDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iQkUxMS0wMSJdIDwtICIxQkUxMSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iQkUxMi0wMSJdIDwtICIxQkUxMiINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkwNy0wMiJdIDwtICIyT0QwNyINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkwOC0wNiJdIDwtICI2RFkwOCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkwOS0wNSJdIDwtICI1RFkwOSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkxMC0wNCJdIDwtICI0RFkxMCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkxMS0wNCJdIDwtICI0RFkxMSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkxMi0wMyJdIDwtICIzRFkxMiINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRUUwOS0wMSJdIDwtICIxRUUwOSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRUUxMC0wMSJdIDwtICIxRUUxMCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iR1AwMC0wMSJdIDwtICIxR1AwMCINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iR1A5OS0wMSJdIDwtICIxR1A5OSINCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iTldFMDYtMDEiXSA8LSAiMU5XMDYiDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDItMDEiXSA8LSAiMVNTMDIiDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDMtMDEiXSA8LSAiMVNTMDMiDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDQtMDEiXSA8LSAiMVNTMDQiDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDUtMDEiXSA8LSAiMVNTMDUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDYtMDEiXSA8LSAiMVNTMDYiDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDctMDEiXSA8LSAiMVNTMDciDQpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09Ik5XRTE3LTA1Il0gPC0gIk5XMTctMDUiDQoNCiNSZW1vdmUgYSBmZXcgZmlsZXMNCg0Kcm0oRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSwgRU1BX0NvbWJpbmVkX1JlY29kZV9DcnVpc2VDb3VudCkNCg0KDQojUmVuYW1lIEFidW5kYW5jZSB0byBFU1RfTlVNX1BFUk0zDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIEVTVF9OVU1fUEVSTTMgPSBBYnVuZGFuY2UpDQoNCiNSZW5hbWUgR2VhckRlcHRoIHRvIE1BWF9HRUFSX0RFUFRIIGFuZCB1c2UgdG8gY2FsY3VsYXRlIEVTVF9OVU1fUEVSTTMNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgTUFYX0dFQVJfREVQVEggPSBHZWFyRGVwdGgpDQoNCiNDb21wdXRlIEVTVF9OVU1fUEVSTTIgPSBFU1RfTlVNX1BFUk0zICogTUFYX0dFQVJfREVQVEgNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRFU1RfTlVNX1BFUk0yIDwtIEVNQV9Db21iaW5lZF9SZWNvZGUkRVNUX05VTV9QRVJNMypFTUFfQ29tYmluZWRfUmVjb2RlJE1BWF9HRUFSX0RFUFRIDQoNCiNDcmVhdGUgY29sdW1ucyBHRUFSX05BTUUsIE1FU0ggZnJvbSBHZWFyQ29kZSBjb2x1bW4NCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZVtFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlID09ICJCb25nbzE1MyJdIDwtICIyMEJPTl8xNTMiDQpFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlW0VNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGUgPT0gIkJvbmdvMzMzIl0gPC0gIjYwQk9OXzMzMyINCkVNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGVbRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZSA9PSAiQm9uZ281MDUiXSA8LSAiNjBCT05fNTA1Ig0KRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZVtFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlID09ICJCb25nbzgwIl0gPC0gIjgwQk9OXzE1MyINCkVNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGVbRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZSA9PSAiSnVkYXkiXSA8LSAiSnVkYXlfMTY4Ig0KRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZVtFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlID09ICJQYWlyb1ZFVCJdIDwtICJQYWlyb1ZFVF8xNTMiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gc2VwYXJhdGUoRU1BX0NvbWJpbmVkX1JlY29kZSwgR2VhckNvZGUsIGMoIkdFQVJfTkFNRSIsICJNRVNIIiksIHNlcCA9ICJfIikNCg0KI1JlbmFtZSBHZWFySW5UaW1lIHRvIEdNVF9EQVRFX1RJTUVfVFhUDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIEdNVF9EQVRFX1RJTUVfVFhUID0gR2VhckluVGltZSkNCiAgDQojUmVuYW1lIFF1YWxpdHkgdG8gSEFVTF9QRVJGT1JNQU5DRSBhbmQgcmVjb2RlIHRvIG1hdGNoIEVjb0RBQVQgDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIEhBVUxfUEVSRk9STUFOQ0UgPSBRdWFsaXR5KQ0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfUEVSRk9STUFOQ0VbRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX1BFUkZPUk1BTkNFID09ICJHIl0gPC0gIkdPT0QiDQpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfUEVSRk9STUFOQ0VbRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX1BFUkZPUk1BTkNFID09ICJRIl0gPC0gIlFVRVNUIg0KDQojQ3JlYXRlIExBVCBhbmQgTE9OIGNvbHVtbiBmcm9tIEdlYXJJbkxhdGl0dWRlIGFuZCBHZWFyIGluIExvbmdpdHVkZQ0KDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBMQVQgPSBHZWFySW5MYXRpdHVkZSkNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgTE9OID0gR2VhckluTG9uZ2l0dWRlKQ0KDQojQ3JlYXRlIGNvbHVtbiBTRVhfTkFNRSBmcm9tIFNleCBhbmQgcmVjb2RlIHRvIG1hdGNoIEVjb0RBQVQgY2F0ZWdvcmllcw0KDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBTRVhfTkFNRSA9IFNleCkNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTRVhfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FID09ICJNIl0gPC0gIk1BTEUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU0VYX05BTUUgPT0gIkYiXSA8LSAiRkVNQUxFIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTRVhfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FID09ICJVIl0gPC0gIk5PVCBERVRFUk1JTkVEIg0KDQojRU1BIFNpemUgY2F0ZWdvcmllcyBhcmUgbnVtZXJvdXMsIHNvIGtlZXAgdGhpcyBjb2x1bW4sIGJ1dCByZW5hbWUgYXMgU0laRV9OQU1FIGZvciBtZXJnaW5nDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIFNJWkVfTkFNRSA9IFNpemUpDQoNCiNDcmVhdGUgU1RBR0VfTkFNRSBjYXRlZ29yeSBieSByZW5hbWluZyAiU3RhZ2VDb2RlIiBhbmQgcmVjb2RpbmcNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgU1RBR0VfTkFNRSA9IFN0YWdlQ29kZSkNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQSJdIDwtICJBRFVMVCINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkEgJiBKIl0gPC0gIkEgKyBKIChBRFVMVC9KVVZFTklMRSkiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJhZHVsdCJdIDwtICJBRFVMVCINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkFkdWx0Il0gPC0gIkFEVUxUIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzEiXSA8LSAiQyAtIDEgKENPUEVQT0RJVEUgSSkiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS0yIl0gPC0gIkMtMSBUTyBDLTIiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS0zIl0gPC0gIkMtMSBUTyBDLTMiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS00Il0gPC0gIkMtMSBUTyBDLTQiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS01Il0gPC0gIkMtMSBUTyBDLTUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS1DNCJdIDwtICJDLTEgVE8gQy00Ig0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzIiXSA8LSAiQyAtIDIgKENPUEVQT0RJVEUgSUkpIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzItQzMiXSA8LSAiQy0yIFRPIEMtMyINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMyLUM1Il0gPC0gIkMtMiBUTyBDLTUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMyJdIDwtICJDIC0gMyAoQ09QRVBPRElURSBJSUkpIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzMtQzQiXSA8LSAiQy0zIFRPIEMtNCINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMzLUM1Il0gPC0gIkMtMyBUTyBDLTUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNCJdIDwtICJDIC0gNCAoQ09QRVBPRElURSBJVikiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNC1DNSJdIDwtICJDLTQgVE8gQy01Ig0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzQtQzYiXSA8LSAiQy00IFRPIEMtNiINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkM1Il0gPC0gIkMgLSA1IChDT1BFUE9ESVRFIFYpIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzYiXSA8LSAiQURVTFQiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJjYWx5cHRvcGlzIl0gPC0gIkNBTFlQVE9QSVMgKFNUQUdFIE5PVCBERVRFUk1JTkVEKSINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImNhbHlwdG9waXMgMSJdIDwtICJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJjYWx5cHRvcGlzIDIiXSA8LSAiQ0FMWVBUT1BJUyAoU1RBR0UgTk9UIERFVEVSTUlORUQpIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiY2FseXB0b3BpcyAzIl0gPC0gIkNBTFlQVE9QSVMgKFNUQUdFIE5PVCBERVRFUk1JTkVEKSINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImN5cHJpcyJdIDwtICJDWVBSSVMiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDeXByaXMiXSA8LSAiQ1lQUklTIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiZWdnIl0gPC0gIkVHRyINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkVnZyJdIDwtICJFR0ciDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJmdXJjaWxpYSJdIDwtICJGVVJDSUxJQSINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkZ1cmNpbGlhIl0gPC0gIkZVUkNJTElBIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiSiJdIDwtICJKVVZFTklMRSINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImp1dmVuaWxlIl0gPC0gIkpVVkVOSUxFIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiSnV2ZW5pbGUiXSA8LSAiSlVWRU5JTEUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJsYXJ2YSJdIDwtICJMQVJWQSINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkxhcnZhIl0gPC0gIkxBUlZBIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAibGFydmFsIl0gPC0gIkxBUlZBIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiTGFydmFsIl0gPC0gIkxBUlZBIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAibWVkdXNhIl0gPC0gIk1FRFVTQSINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIk1lZHVzYSJdIDwtICJNRURVU0EiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJtZWdhbG9wYSJdIDwtICJNRUdBTE9QQUUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJNZWdhbG9wYSJdIDwtICJNRUdBTE9QQUUiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJuYXVwbGl1cyJdIDwtICJOQVVQTElVUyINCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIk5hdXBsaXVzIl0gPC0gIk5BVVBMSVVTIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiTkQiXSA8LSAiTk9UIERFVEVSTUlORUQiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJwb3N0LWxhcnZhIl0gPC0gIlBPU1QgTEFSVkEiDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJVIl0gPC0gIk5PVCBERVRFUk1JTkVEIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiem9lYSJdIDwtICJaT0VBIg0KRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiWm9lYSJdIDwtICJaT0VBIg0KDQojQ3JlYXRlIENvbHVtbiBTVEFUSU9OX05BTUUgYnkgdXNpbmcgdGhlIGxhc3QgMyBkaWdpdHMgb2YgU3RhdGlvbklEDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBVElPTl9OQU1FPC0gc3Vic3RyaW5nIChFTUFfQ29tYmluZWRfUmVjb2RlJFN0YXRpb25JRCwgOSwxMSkNCg0KI0NyZWF0ZSBUQVhPTl9OQU1FIGNvbHVtbiBhbmQgcmVjb2RlIHRvIG1hdGNoIEVjb0RBQVQNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgVEFYT05fTkFNRSA9IEN1cnJlbnRfTmFtZSkNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQWNhbnRob215c2lzIHNwLiJdIDwtICJBY2FudGhvbXlzaXMgc3BwLiINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQWNhbnRob215c2lzIHN0ZWxsZXJpIl0gPC0gIkFjYW50aG9teXNpcyBzdGVsbGVyaSAoRXhhY2FudGhvbXlzaXMgYXJjdG9wYWNpZmljYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkFudGhvYXRoZWNhdGFlIl0gPC0gIkFudGhvYXRoZWNhdGEgKEFudGhvbWVkdXNhZSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNhbmNyaWRhZSJdIDwtICJDYW5jcmlkYWUgKEJyYWNoeXVyYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNhbmRhY2lhIGNvbHVtYmlhZSJdIDwtICJDYW5kYWNpYSBDb2x1bWJpYWUiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNhcHJlbGxpZGVhIl0gPC0gIkNhcHJlbGxpZGFlIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDbHl0aWEgZ3JlZ2FyaWEiXSA8LSAiQ2x5dGlhIGdyZWdhcmlhIChQaGlhbGlkaXVtIGdyZWdhcml1bSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNuaWRhcmlhIl0gPC0gIkNuaWRhcmlhbiBtZWR1c2FlIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDb3JvcGhpdW0gc3BwLiJdIDwtICJDb3JvcGhpdW0iDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkRpc2FjYW50aG9teXNpcyBkeWJvd3NraWkiXSA8LSAiRGlzY2FudGhvbXlzaXMgKEFjYW50aG9teXNpcykgRHlib3dza2lpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJFcGlsYWJpZG9jZXJhIGFtcGhpdHJpdGVzIl0gPC0gIkVwaWxhYmlkb2NlcmEgYW1waGl0cml0ZXMgKEUuIGxvbmdpcGVkYXRhKSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiRXBpbGFiaWRvY2VyYSBsb25naXBlZGF0YSJdIDwtICJFcGlsYWJpZG9jZXJhIGFtcGhpdHJpdGVzIChFLiBsb25naXBlZGF0YSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkV1cGhhdXNpYSBzcHAuIl0gPC0gIkV1cGhhdXNpYWNlYSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiRXVyeXRlbW9yYSBwYWNpZmljYSJdIDwtICJFdXJ5dGVtb3JhIHBhY2lmaWNhIChFLiBqb2hhbnNlbmkpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJFdXJ5dGVtb3JhIHNwLiJdIDwtICJFdXJ5dGVtb3JhIHNwcC4iDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkdhbW1hcmlkYWUiXSA8LSAiR2FtbWFyaWRlYSAoVW5pZGVudGlmaWFibGUpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJHYW1tYXJpZGVhIl0gPC0gIkdhbW1hcmlkZWEgKFVuaWRlbnRpZmlhYmxlKSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiSGlwcG9seXRpZGFlIl0gPC0gIkhpcHBvbHl0aWRhZSAoQ2FyaWRlYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkh5ZHJvbWVkdXNhZSAoSHlkcm9pZG9saW5hIl0gPC0gIkh5ZHJvbWVkdXNhZSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiTGVwdG90aGVjYXRhZSJdIDwtICJMZXB0b3RoZWNhdGEgKExlcHRvbWVkdXNhZSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkxpdGhvZGlkYWUiXSA8LSAiTGl0aG9kaWRhZSAoQW5vbXVyYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk1hamlkYWUiXSA8LSAiTWFqaWRhZSAoQnJhY2h5dXJhKSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiTWV0ZXJ5dGhyb3BzIHJvYnVzdGEiXSA8LSAiTWV0ZXJ5dGhyb3BzIHJvYnVzdHVzIChNLiByb2J1c3RhKSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiTXlzaWRhIl0gPC0gIk15c2lkYSAoVW5pZGVudGlmaWFibGUpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJPY3RvcG9kYSJdIDwtICJPY3RvcG9kaWZvcm1lcyAoT2N0b3B1cykgbGFydmFlIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJPaXRob25hIHNldGlnZXJhIl0gPC0gIk9pdGhvbmEgc2V0aWdlcmEgKE8uIHNwaW5pcm9zdHJpcykiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk9pdGhvbmEgc3Bpbmlyb3N0cmlzIl0gPC0gIk9pdGhvbmEgc2V0aWdlcmEgKE8uIHNwaW5pcm9zdHJpcykiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNoaW9ub2VjZXRlcyBzcHAuIl0gPC0gIk9yZWdvbmlpZGFlIChCcmFjaHl1cmEpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJIeWFzIHNwcC4iXSA8LSAiT3JlZ29uaWlkYWUgKEJyYWNoeXVyYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk9yZWdvbmlpZGFlIl0gPC0gIk9yZWdvbmlpZGFlIChCcmFjaHl1cmEpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJQYWNpZmFjYW50aG9teXNpcyBuZXBocm9waHRoYWxtYSJdIDwtICJQYWNpZmFjYW50aG9teXNpcyAoQWNhbnRob215c2lzKSBuZXBocm9waHRoYWxtYSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUGFndXJpZGFlIl0gPC0gIlBhZ3VyaWRhZSAoQW5vbXVyYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBhcmFldWNoYWV0YSBlbG9uZ2F0YSJdIDwtICJQYXJhZXVjaGFldGEgZWxvbmdhdGEgKEV1Y2hhZXRhIGVsb25nYXRhKSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUGFyYXNhZ2l0dGEgZWxlZ2FucyJdIDwtICJQYXJhc2FnaXR0YSAoU2FnaXR0YSkgZWxlZ2FucyINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUGhvcm9uaWRhIChhY3Rpbm90cm9jaCBsYXJ2YSkiXSA8LSAiUGhvcm9uaWRhIGFjdGlub3Ryb2NoIChsYXJ2YWUpIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJQb2RvbiBsZXVja2FydGlpIl0gPC0gIlBvZG9uIGxldWNrYXJ0aSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUHNldWRvYW1hbGxvdGhyaXggb3ZhdGEiXSA8LSAiUHNldWRvYW1hbGxvdGhyaXggKHNjb2xlY2l0aHJpY2VsbGEpIG92YXRhIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJTeXJyaG9lIl0gPC0gIlN5cnJob2Ugc3BwLiINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiVGVzc2FyYWJyYWNoaW9uIG9jdWxhdHVzIl0gPC0gIlRlc3NhcmFicmFjaGlvbiBvY3VsYXR1bSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiVGhlY29zb21hdGEiXSA8LSAiVGhlY29zb21hdGEgKFVuaWRlbnRpZmlhYmxlKSINCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiVGhlbWlzdG8gcGFjaWZpY2EiXSA8LSAiVGhlbWlzdG8gcGFjaWZpY2EgKFBhcmF0aGVtaXN0byBwYWNpZmljYSkiDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlRyaWNvbmlhIHNwLiJdIDwtICJUcmljb25pYSBzcHAuIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDYWxhbmlkYWUiXSA8LSAiVW5pZGVudGlmaWVkIENhbGFuaWRzIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDYWxhbm9pZGEiXSA8LSAiVW5pZGVudGlmaWVkIENhbGFuaWRzIg0KDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJYZW5hY2FudGhvbXlzaXMgcHNldWRvbWFjcm9wc2lzIl0gPC0gIlhlbm9hY2FudGhvbXlzaXMgKEFjYW50aG9teXNpcykgcHNldWRvbWFjcm9wc2lzIg0KDQoNCg0KI0NyZWF0ZSBWT0xVTUVfRklMVEVSRUQgY29sdW1uIGJ5IHJlbmFtaW5nIFRvd1ZPbHVtZSBjb2x1bW4NCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgVk9MVU1FX0ZJTFRFUkVEID0gVG93Vm9sdW1lKQ0KDQojUmVuYW1lIEJvdHRvbURlcHRoIHRvIEJPVFRPTV9ERVBUSCB0byBtYXRjaCBFY29EQUFUDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIEJPVFRPTV9ERVBUSCA9IEJvdHRvbURlcHRoKQ0KDQoNCiNSZWFycmFuZ2UgdGhlIGZpbGUgdG8gYWRkIGEgY29sdW1uIGluZGljYXRpbmcgb3JpZ2luIG9mIGRhdGEsIHRvIGhhdmUgdGhlbSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgRWNvREFBVCBmaWxlIGFuZCByZW1vdmUgbm9uLW1hdGNoZWQgY29sdW1ucyBwcmlvciB0byBtZXJnZQ0KDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkREFUQV9TT1VSQ0UgPC0gIkVNQSINCg0KI0luc2V0IGNvbHVtbnMgbm90IHByZXNlbnQgaW4gRU1BLCBidXQgd2lsbCBiZSBpbiBFY29EQUFUDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUkRElTX1BFUlZPTE0yIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJERJU19QRVJWT0xNMyA8LSBOQQ0KRU1BX0NvbWJpbmVkX1JlY29kZSRGT0NJX0lEIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJEZPQ0lfU0FNUExFX0lEIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJEdFT0dSQVBISUNfQVJFQSA8LSBOQQ0KRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX0lEIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfTkFNRSA8LSBOQQ0KRU1BX0NvbWJpbmVkX1JlY29kZSRNSU5fR0VBUl9ERVBUSCA8LSBOQQ0KRU1BX0NvbWJpbmVkX1JlY29kZSRORVQgPC0gTkENCkVNQV9Db21iaW5lZF9SZWNvZGUkU0FNUExFX0RFUFRIIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNFWCA8LSBOQQ0KRU1BX0NvbWJpbmVkX1JlY29kZSRTUEVDSU1FTl9GT1JNIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFIDwtIE5BDQpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX1NJWkUgPC0gTkENCkVNQV9Db21iaW5lZF9SZWNvZGUkWk9PUF9DT1BFUE9EX05BVVBMSUkgPC0gTkENCkVNQV9Db21iaW5lZF9SZWNvZGUkWk9PUF9FVVBIQVVTSUlEX0VHRyA8LSBOQQ0KDQoNCiNDcmVhdGUgSEFVTF9JRCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIG1lcmdpbmcgcHVycG9zZXMNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX0lEIDwtIHBhc3RlMChFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSwiICIsRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFUSU9OX05BTUUsIiAiLCAxLCIgIiwgRU1BX0NvbWJpbmVkX1JlY29kZSRHRUFSX05BTUUsIiAiLCAxKQ0KDQoNCiNDcmVhdGUgdmVjdG9yIG9mIGNvbHVtbiBuYW1lcyBmcm9tIHRoZSBFY29EQUFUIEZpbGUNCg0KRWNvREFBVF9Db2x1bW5OYW1lcyA8LSBjKCJCT1RUT01fREVQVEgiLCAiQ1JVSVNFIiwgIkRBWSIsICJESVNfUEVSVk9MTTIiLCAiRElTX1BFUlZPTE0zIiwgIkVTVF9OVU1fUEVSTTIiLCAiRVNUX05VTV9QRVJNMyIsICJGT0NJX0lEIiwgIkZPQ0lfU0FNUExFX0lEIiwgIkdFQVJfTkFNRSIsICJHRU9HUkFQSElDX0FSRUEiLCAiR01UX0RBVEVfVElNRV9UWFQiLCAiSEFVTF9JRCIsICJIQVVMX05BTUUiLCAiSEFVTF9QRVJGT1JNQU5DRSIsICJMQVQiLCAiTE9OIiwgIk1BWF9HRUFSX0RFUFRIIiwgIk1FU0giLCAiTUlOX0dFQVJfREVQVEgiLCAiTU9OVEgiLCAiTkVUIiwgIlNBTVBMRV9ERVBUSCIsICJTRVgiLCAiU0VYX05BTUUiLCAiU0laRV9OQU1FIiwgIlNQRUNJTUVOX0ZPUk0iLCAiU1RBR0UiLCAiU1RBR0VfTkFNRSIsICJTVEFUSU9OX05BTUUiLCAiVEFYT05fTkFNRSIsICJUQVhPTl9TSVpFIiwgIlZPTFVNRV9GSUxURVJFRCIsICAiWUVBUiIsICJaT09QX0NPUEVQT0RfTkFVUExJSSIsICJaT09QX0VVUEhBVVNJSURfRUdHIiwgIkRBVEFfU09VUkNFIikNCg0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBFTUFfQ29tYmluZWRfUmVjb2RlWywgRWNvREFBVF9Db2x1bW5OYW1lc10NCg0KDQpgYGANCg0KSW1wb3J0IEVjb0RBQVQgZGF0YQ0KDQpDb25uZWN0IHRvIGRhdGFiYXNlIHRvIGltcG9ydCB6b29wIGRhdGEgZGlyZWN0bHkgZnJvbSBFY29EQUFUDQoNCmBgYHtyfQ0KI0NyZWF0ZSBjb25uZWN0IHRvIHRoZSBBRlNDIGRhdGFiYXNlDQoNCnVzZXIgPC0gcmVhZGxpbmUoIklucHV0IFVzZXJuYW1lOiAiKQ0KcHN3ZCA8LSByZWFkbGluZSgiSW5wdXQgUGFzc3dvcmQ6ICIpDQoNCkFGU0NfQ29ubmVjdCA8LSBvZGJjQ29ubmVjdCgiQUZTQyIsIHVpZD11c2VyLCAgcHdkPXBzd2QpDQoNCg0KI0RlbGV0ZSBhbmQgcmVmcmVzaCB0YWJsZSB0byBkcmF3IGZyb20sIGluIHRoaXMgY2FzZSBpdCBpcyBTUEVDSU1FTl9NQUlOX0dFT00NCg0Kc3FsUXVlcnkoQUZTQ19Db25uZWN0LCJEUk9QIFRBQkxFIFNQRUNJTUVOX01BSU5fR0VPTTsiKQ0KDQpzcWxRdWVyeShBRlNDX0Nvbm5lY3QsIkNSRUFURSBUQUJMRSBTUEVDSU1FTl9NQUlOX0dFT00gQVMgU0VMRUNUICogRlJPTSBFQ09EQUFULlNQRUNJTUVOX01BSU5fR0VPTTsiKQ0KDQoNCiNSdW4gU1FMIFF1ZXJpZXMgdG8gYnVpbGQgem9vcGxhbmt0b24gZGF0YXNldCANCg0KI1F1ZXJ5IHRoZSBkYXRhYmFzZQ0KDQp6b29wZGF0YSA8LSBzcWxRdWVyeShBRlNDX0Nvbm5lY3QsICJTRUxFQ1QgQk9UVE9NX0RFUFRILA0KQ1JVSVNFLCBEQVksIERJU19QRVJWT0xNMiwgRElTX1BFUlZPTE0zLCBFU1RfTlVNX1BFUk0yLCBFU1RfTlVNX1BFUk0zLCBGT0NJX0lELCBGT0NJX1NBTVBMRV9JRCwgR0VBUl9OQU1FLCANCkdFT0dSQVBISUNfQVJFQSwgR01UX0RBVEVfVElNRV9UWFQsIEhBVUxfSUQsIEhBVUxfTkFNRSwgSEFVTF9QRVJGT1JNQU5DRSwgTEFULCBMT04sIE1BWF9HRUFSX0RFUFRILCBNRVNILA0KTUlOX0dFQVJfREVQVEgsIE1PTlRILCBORVQsIFNBTVBMRV9ERVBUSCwgU0VYLCBTRVhfTkFNRSwgU0laRV9OQU1FLCBTUEVDSU1FTl9GT1JNLCBTVEFHRSwgU1RBR0VfTkFNRSwgU1RBVElPTl9OQU1FLA0KVEFYT05fTkFNRSwgVEFYT05fU0laRSwgVk9MVU1FX0ZJTFRFUkVELCBZRUFSLCBaT09QX0NPUEVQT0RfTkFVUExJSSwgWk9PUF9FVVBIQVVTSUlEX0VHRw0KRlJPTSBTUEVDSU1FTl9NQUlOX0dFT00gV0hFUkUgT1JJR19EQiBMSUtFICdCT0InOyIsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpDQoNCiNDbG9zZSBkYXRhYmFzZSBjb25uZWN0aW9uDQoNCm9kYmNDbG9zZShBRlNDX0Nvbm5lY3QpDQoNCg0KI0Ryb3Agb25lIGNydWlzZSB1c2luZyB0aGUgb2xkIHByb3RvY29sIE9TMTcgYW5kIHJlcGxhY2Ugd2l0aCBjb3JyZWN0IGRhdGENCg0Kem9vcGRhdGEgPC0gZmlsdGVyKHpvb3BkYXRhLCBDUlVJU0UhPSJPUzE3LTAxIikNCg0KI0JyaW5nIGluIE9TMTctMDENCg0KT1MxNzAxIDwtIHJlYWQuY3N2KGhlcmUoIlJhdy1EYXRhIiwgIk9TMTcwMV9FY29GT0NJX1pvb3BsYW5rdG9uTmV0LmNzdiIpKQ0KDQp6b29wZGF0YSA8LSByYmluZCh6b29wZGF0YSwgT1MxNzAxKQ0KDQojRGVsZXRlIE9TMTcwMQ0KDQpybShPUzE3MDEpDQoNCg0KYGBgDQoNCkRvIHNvbWUgZGF0YSB0aWR5aW5nIGZvciB0aGUgRWNvREFBVCBkYXRhIHNldCBhbmQgY29tYmluZSB0aGUgRWNvREFBVCBhbmQgRU1BIGRhdGFzZXRzDQoNCg0KYGBge3J9DQoNCiNSZWNvZGUgbWVzaCBzaXplcyBmb3IgMTUwLCAzMzMsIDUwMA0KDQp6b29wZGF0YSRNRVNIW3pvb3BkYXRhJE1FU0g9PTE1MF0gPC0gMTUzDQp6b29wZGF0YSRNRVNIW3pvb3BkYXRhJE1FU0g9PTE1NF0gPC0gMTUzDQp6b29wZGF0YSRNRVNIW3pvb3BkYXRhJE1FU0g9PTExNTNdIDwtIDE1Mw0Kem9vcGRhdGEkTUVTSFt6b29wZGF0YSRNRVNIPT0zMzVdIDwtIDMzMw0Kem9vcGRhdGEkTUVTSFt6b29wZGF0YSRNRVNIPT01MDBdIDwtIDUwNQ0KDQoNCiNDb3VudCBudW1iZXIgb2YgY3J1aXNlcyBpbiB0aGUgRU1BIGRhdGFzZXQNCg0KRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSA8LSBncm91cF9ieShFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UpDQpFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50IDwtIHN1bW1hcmlzZShFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFLCBuX2Rpc3RpbmN0KFlFQVIpKQ0KDQp1bmdyb3VwKEVNQV9Db21iaW5lZF9SZWNvZGUpDQoNCiNDb3VudCBudW1iZXIgb2YgY3J1aXNlcyBpbiB0aGUgRU1BIGRhdGFzZXQNCg0Kem9vcGRhdGFfYnlDUlVJU0UgPC0gZ3JvdXBfYnkoem9vcGRhdGEsIENSVUlTRSkNCnpvb3BkYXRhX0NydWlzZUNvdW50IDwtIHN1bW1hcmlzZSh6b29wZGF0YV9ieUNSVUlTRSwgbl9kaXN0aW5jdChZRUFSKSkNCg0KdW5ncm91cCh6b29wZGF0YSkNCg0KDQoNCiNEbyBhIGpvaW4gdG8gc2VlIGlmIGNydWlzZXMgaGF2ZSBtYXRjaGVzIGluIGJvdGggZGF0YXNldHM6DQoNClRlc3REYXRhIDwtIHNlbWlfam9pbihFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50LCB6b29wZGF0YV9DcnVpc2VDb3VudCwgYnkgPSAiQ1JVSVNFIikNCg0KDQoNCg0KIzEwIGNydWlzZXMgYXJlIHByZXNlbnQgaW4gRU1BIGRhdGFzZXQgYW5kIHpvb3BkYXRhIGRhdGEgc2V0LCByZW1vdmUgdGhvc2UgZnJvbSB0aGUgRU1BIGRhdGFzZXQgdG8gYXZvaWQgZG91YmxlIGNvdW50aW5nDQoNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IjFHUDk5IikNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IjNEWTEyIikNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkFFMTQtMDEiKQ0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iQUUxNS0wMSIpDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJEWTE0LTA2IikNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkRZMTQtMDgiKQ0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iRFkxNS0wNyIpDQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJEWTE1LTA4IikNCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkRZMTYtMDkiKQ0KRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iTlcxNy0wNSIpDQoNCiNSZW1vdmVGaWxlcw0KDQpybShFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFLCBFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50LCB6b29wZGF0YV9ieUNSVUlTRSwgem9vcGRhdGFfQ3J1aXNlQ291bnQsIFRlc3REYXRhKQ0KDQojQ29tYmluZSB0aGUgRU1BIGFuZCBFY29EQUFUIGRhdGFzZXRzDQoNCiNBZGQgRGF0YSBTb3VyY2UgZmlsZSB0byB0aGUgem9vcGRhdGEgcHJpb3IgdG8gY29tYmluYXRpb24NCg0Kem9vcGRhdGEkREFUQV9TT1VSQ0UgPC0gIkVjb0RBQVQiDQoNCg0KI0NvbWJpbmUgZGF0YXNldHMgDQoNCkFsbFpvb3BfUmF3IDwtIHJiaW5kKEVNQV9Db21iaW5lZF9SZWNvZGUsIHpvb3BkYXRhKQ0KDQoNCg0KI0NyZWF0ZSB2ZWN0b3Igb2YgQ29tYmluZWQgY29sdW1uIG5hbWVzIHRvIHRyaW0gZGF0YXNldCBmb3IgZmluYWwgcHJvY2Vzc2luZw0KDQpDb21iaW5lZF9Db2x1bW5OYW1lcyA8LSBjKCJCT1RUT01fREVQVEgiLCAiQ1JVSVNFIiwgIkRBWSIsICJESVNfUEVSVk9MTTIiLCAiRElTX1BFUlZPTE0zIiwgIkVTVF9OVU1fUEVSTTIiLCAiRVNUX05VTV9QRVJNMyIsICJHRUFSX05BTUUiLCAiR01UX0RBVEVfVElNRV9UWFQiLCAiSEFVTF9JRCIsICJIQVVMX1BFUkZPUk1BTkNFIiwgIkxBVCIsICJMT04iLCAiTUFYX0dFQVJfREVQVEgiLCAiTUVTSCIsICJNT05USCIsICJTUEVDSU1FTl9GT1JNIiwgIlNFWF9OQU1FIiwgIlNJWkVfTkFNRSIsICJTVEFHRV9OQU1FIiwgIlNUQVRJT05fTkFNRSIsICJUQVhPTl9OQU1FIiwgIlZPTFVNRV9GSUxURVJFRCIsICAiWUVBUiIsICJEQVRBX1NPVVJDRSIpDQoNCiNLZWVwIG9ubHkgdGhvc2UgY29sdW1ucw0KDQpBbGxab29wX1JhdyA8LSBBbGxab29wX1Jhd1ssQ29tYmluZWRfQ29sdW1uTmFtZXNdDQoNCiNSZW1vdmUgZmlsZXMNCg0Kcm0gKEVNQV9Db21iaW5lZCwgRU1BX0NvbWJpbmVkX1JlY29kZSwgem9vcGRhdGEpDQoNCg0KDQpgYGANCg0KDQpRdWljayBtYXAgb2YgdGhlIHJhdyBkYXRhIHN0YXRpb25zDQoNCmBgYHtyfQ0KDQojUXVpY2sgcGxvdCB0byB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YXNldCBzbyBmYXINCg0KI0dldCB3b3JsZCBkYXRhIGZyb20gI25hdHVyYWwgZWFydGggcGFja2FnZQ0KDQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0KY2xhc3Mod29ybGQpDQoNCiMgZ2V0IHJlZ2lvbmFsIHBvbHlnb25zDQpyZWcgPSBtYXBfZGF0YSgid29ybGQySGlyZXMiKQ0KcmVnID0gc3Vic2V0KHJlZywgcmVnaW9uICVpbiUgYygnVVNTUicsICdVU0EnKSkNCg0KIyBjb252ZXJ0IGxhdCBsb25ncw0KcmVnJGxvbmcgPSAoMzYwIC0gcmVnJGxvbmcpKi0xDQoNCiMgc2V0IG1hcCBsaW1pdHMNCmxvbnMgPSBjKC0xNzkuNSwgLTEzMCkNCmxhdHMgPSBjKDUwLCA3NCkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIG1ha2UgcGxvdA0KUmVnaW9uX01hcF9SYXdEYXRhIDwtIGdncGxvdCgpKw0KDQogICMgYWRkIGNvYXN0bGluZQ0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCkrDQogICAgY29vcmRfc2YoeGxpbSA9IGxvbnMsIHlsaW0gPSBsYXRzLCBleHBhbmQgPSBGQUxTRSkrDQoNCiAgI1Bsb3Qgc3RhdGlvbiBwb2ludHMNCiAgZ2VvbV9wb2ludChkYXRhPUFsbFpvb3BfUmF3LCBtYXBwaW5nPWFlcyhMT04sIExBVCkpKw0KDQogICMgZm9ybWF0dGluZw0KICB0aGVtZV9idygpKw0KICB4bGFiKCJMb25naXR1ZGUiKSsNCiAgeWxhYigiTGF0aXR1ZGUiKQ0KDQpSZWdpb25fTWFwX1Jhd0RhdGENCg0KDQpgYGANCg0KRGF0YSBGaWx0ZXJpbmcgZm9yIEJQIFN5bnRoZXNpcyBQcm9qZWN0DQoNCmBgYHtyfQ0KDQojRmlyc3QgZmlsdGVyIGZvciBhbGwgZGF0YSBub3J0aCBvZiA2ME4NCg0KTkJTX1pvb3AgPC0gZmlsdGVyKEFsbFpvb3BfUmF3LCBMQVQ+PTYwKQ0KDQoNCiNOb3cgbWFwIGFnYWluIHRvIHRha2UgYSBsb29rDQoNCiMgbWFrZSBwbG90DQpSZWdpb25fTWFwX05CU19Qcm9jZXNzXzEgPC0gZ2dwbG90KCkrDQoNCiAgIyBhZGQgY29hc3RsaW5lDQogIGdlb21fc2YoZGF0YSA9IHdvcmxkKSsNCiAgICBjb29yZF9zZih4bGltID0gbG9ucywgeWxpbSA9IGxhdHMsIGV4cGFuZCA9IEZBTFNFKSsNCg0KICAjUGxvdCBzdGF0aW9uIHBvaW50cw0KICBnZW9tX3BvaW50KGRhdGE9TkJTX1pvb3AsIG1hcHBpbmc9YWVzKExPTiwgTEFUKSkrDQoNCiAgIyBmb3JtYXR0aW5nDQogIHRoZW1lX2J3KCkrDQogIHhsYWIoIkxvbmdpdHVkZSIpKw0KICB5bGFiKCJMYXRpdHVkZSIpDQoNClJlZ2lvbl9NYXBfTkJTX1Byb2Nlc3NfMQ0KDQoNCiNMb29rcyBsaWtlIHNvbWUgZGF0YSBmcm9tIHRoZSBHT0EgaXMgc3RpbGwgcHJlc2VudCwgc28gcmVtb3ZlIGRhdGEgPiAxNTUNCg0KTkJTX1pvb3AgPC0gZmlsdGVyKE5CU19ab29wLCBMT048PSAtMTUwKQ0KDQojTm93IG1hcCBhZ2FpbiB0byB0YWtlIGEgbG9vaw0KDQojIG1ha2UgcGxvdA0KUmVnaW9uX01hcF9OQlNfUHJvY2Vzc18yIDwtIGdncGxvdCgpKw0KDQogICMgYWRkIGNvYXN0bGluZQ0KICBnZW9tX3NmKGRhdGEgPSB3b3JsZCkrDQogICAgY29vcmRfc2YoeGxpbSA9IGxvbnMsIHlsaW0gPSBsYXRzLCBleHBhbmQgPSBGQUxTRSkrDQoNCiAgI1Bsb3Qgc3RhdGlvbiBwb2ludHMNCiAgZ2VvbV9wb2ludChkYXRhPU5CU19ab29wLCBtYXBwaW5nPWFlcyhMT04sIExBVCkpKw0KDQogICMgZm9ybWF0dGluZw0KICB0aGVtZV9idygpKw0KICB4bGFiKCJMb25naXR1ZGUiKSsNCiAgeWxhYigiTGF0aXR1ZGUiKQ0KDQpSZWdpb25fTWFwX05CU19Qcm9jZXNzXzINCg0KI1NwYXRpYWwgY292ZXJhZ2UgbG9va3MgY29ycmVjdA0KDQojTm93IGNoZWNrIHRlbXBvcmFsIGNvdmVyYWdlDQoNCnNvcnQodW5pcXVlKE5CU19ab29wJFlFQVIpLCBkZWNyZWFzaW5nID0gRkFMU0UpDQoNCiNSZW1vdmUgZGF0YSBmcm9tIDE5OTYgYXMgaXQgaXMgcmVtb3ZlZCBmcm9tIGFsbCBvdGhlciB5ZWFycyBvZiBjb2xsZWN0aW9uDQoNCk5CU19ab29wIDwtIGZpbHRlcihOQlNfWm9vcCwgWUVBUiE9MTk5NikNCg0KI1Rha2UgYSBsb29rIGF0IHRoZSBnZWFycyBwcmVzZW50IGluIHRoZSBkYXRhc2V0DQoNCnVuaXF1ZShOQlNfWm9vcCRHRUFSX05BTUUpDQp1bmlxdWUoTkJTX1pvb3AkTUVTSCkNCg0KI1JvdWdoIGVzdGltYXRlIG9mIG51bWJlciBvZiBzYW1wbGVzIGJ5IGdlYXIgdHlwZQ0KDQpOQlNfWm9vcF9HZWFyIDwtIE5CU19ab29wWywgYygiQ1JVSVNFIiwgIkdFQVJfTkFNRSIsICJNRVNIIiwgIkxBVCIsICJMT04iKV0NCg0KTkJTX1pvb3BfR2VhciA8LSBkaXN0aW5jdChOQlNfWm9vcF9HZWFyKQ0KDQpOQlNfWm9vcF9HZWFyX2J5R2VhciA8LSBncm91cF9ieShOQlNfWm9vcF9HZWFyLCBHRUFSX05BTUUsIE1FU0gpDQoNCk5CU19HZWFyX1N1bW1hcnkgPC0gc3VtbWFyaXNlKE5CU19ab29wX0dlYXJfYnlHZWFyLCBuKCkpDQoNCnVuZ3JvdXAoTkJTX1pvb3BfR2VhcikNCg0KI1RoaXMgc2hvd3MgYSBmZXcgZ2VhcnMgY2FuIGJlIGVsaW1pbmF0ZWQgZm9yIGxvdyBzYW1wbGUgc2l6ZSAoVjYwQk9OLCA4MEJPTikgYW5kIENBTFZFVCBoYXMgdG9vIHNtYWxsIG1lc2ggc2l6ZQ0KDQpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IkNBTFZFVCIpDQpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IlY2MEJPTiIpDQpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IjgwQk9OIikNCg0KI1JlbW92ZSBzbGVkIGRhdGEgYXMgdGhpcyBpcyBiaWFzZWQgdG93YXJkIGEgYm90dG9tIHNhbXBsZQ0KDQpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IlNMRUQiKQ0KDQoNCg0KI1JlbW92ZSBmYWlsZWQgYW5kIHF1ZXN0aW9uYWJsZSBoYXVscw0KDQojRmlyc3Qgc2F2ZSB0aGUgTkEgc2luY2UgRU1BIGRhdGEgZG9lcyBub3QgYWx3YXlzIHJlY29yZCBIQVVMX1BFUkZPUk1BTkNFDQoNCkhhdWxQZXJmX05BIDwtIE5CU19ab29wW2lzLm5hKE5CU19ab29wJEhBVUxfUEVSRk9STUFOQ0UpLF0NCg0KTkJTX1pvb3BfR09PRCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEhBVUxfUEVSRk9STUFOQ0U9PSJHT09EIikNCg0KI1JlYnVpbGQgZGF0YXNldCB3aXRob3V0IFFVRVNUIGFuZCBGQUlMIEhBVUxTDQoNCk5CU19ab29wIDwtIHJiaW5kKEhhdWxQZXJmX05BLCBOQlNfWm9vcF9HT09EKQ0KDQoNCg0KI1dyaXRlIHRoaXMgcmF3IGZpbGUgcHJpb3IgdG8gZnVydGhlciBwcm9jZXNzaW5nDQoNCndyaXRlLmNzdihOQlNfWm9vcCwgaGVyZSgiUmF3LURhdGEiLCAiTkJTX1pvb3BfUmF3LmNzdiIpKQ0KDQpgYGANCg0KQnJpbmcgaW4gdGhlIENvYXJzZSBUYXhhIExpc3QgdG8gYWlkIGluIGx1bXBpbmcgYW5kIGZpbHRlciBvdXQgc29tZSB0YXhhDQoNCg0KYGBge3J9DQoNClRheGFMaXN0X0NvYXJzZSA8LSByZWFkLmNzdihoZXJlKCJUYXhhLUxpc3RzIiwgIlRheGFMaXN0X0NvYXJzZS5jc3YiKSkNCg0KI05vdyBhZGQgdGhpcyB0byB0aGUgZmlsZQ0KDQpUYXhhTGlzdF9Db2Fyc2UgPC0gZGlzdGluY3QoVGF4YUxpc3RfQ29hcnNlKQ0KDQpOQlNfWm9vcF9Qcm9jZXNzIDwtIGxlZnRfam9pbihOQlNfWm9vcCwgVGF4YUxpc3RfQ29hcnNlLCBieSA9ICJUQVhPTl9OQU1FIikNCg0KI0ZpbHRlciBvdXQgdGhvc2UgZGF0YSBtYXJrZWQgZm9yIHJlbW92YWwNCg0KTkJTX1pvb3BfUHJvY2VzcyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgTk9URSAhPSAiUmVtb3ZlIikNCg0KDQpgYGANCg0KDQoNCkNyZWF0ZSB0YXhhIHNwZWNpZmljIGRhdGEgc2V0cyB0byBzZWxlY3QgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgR0VBUl9OQU1FIGFuZCBNRVNIIGZvciBlYWNoIHNwZWNpZmljIGNvYXJzZSB0YXhhDQoNCkFjYXJ0aWEgc3BwDQoNCmBgYHtyfQ0KDQpBY2FydGlhX3NwcCA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBY2FydGlhIHNwcC4iKQ0KDQojQWNhcnRpYSBpcyBhIHNtYWxsIGNvcGVwb2QsIHNvIGFsbCBlc3RpbWF0ZXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgc21hbGxlciBuZXRzDQoNCiNGaWx0ZXIgZm9yIGNvcnJlY3QgZ2Vhcg0KDQpBY2FydGlhX3NwcCA8LSBmaWx0ZXIoQWNhcnRpYV9zcHAsIEdFQVJfTkFNRSE9ICI2MEJPTiIpDQoNCg0KI0JlaW5nIHRvIGJ1aWxkIGZpbmFsIGRhdGEgc2V0DQoNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBBY2FydGlhX3NwcA0KDQoNCg0KYGBgDQoNCkFnbGFudGhhIGRpZ2l0YWxlDQoNCmBgYHtyfQ0KDQpBZ2xhbnRoYV9kaWdpdGFsZSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBZ2xhbnRoYSBkaWdpdGFsZSIpDQoNCiNDaG9vc2UgdG8gZXN0aW1hdGUgQ25pZGFyaWFucyBmcm9tIHRoZSA2MEJPTiBvbmx5DQoNCkFnbGFudGhhX2RpZ2l0YWxlIDwtIGZpbHRlcihBZ2xhbnRoYV9kaWdpdGFsZSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBBZ2xhbnRoYV9kaWdpdGFsZSkNCg0KDQpgYGANCg0KQW1waGlwb2RzDQoNCmBgYHtyfQ0KDQpBbXBoaXBvZGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQW1waGlwb2RhIikNCg0KI0FtaGlwb2RzIHdpbGwgYmUgZXN0aW1hdGVkIGZyb20gdGhlIDYwQk9OIG9ubHkNCg0KQW1waGlwb2RhIDwtIGZpbHRlcihBbXBoaXBvZGEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQW1waGlwb2RhKQ0KDQoNCmBgYA0KDQoNCkFub211cmENCg0KYGBge3J9DQoNCkFub211cmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQW5vbXVyYSIpDQoNCiNBbm9tdXJhIGVzdGltYXRlIGZyb20gNjBCT04gb25seQ0KDQpBbm9tdXJhIDwtIGZpbHRlcihBbXBoaXBvZGEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEFub211cmEpDQoNCg0KYGBgDQoNCg0KQXBwZW5kaWN1bGFyaWENCg0KYGBge3J9DQoNCkFwcGVuZGljdWxhcmlhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkFwcGVuZGljdWxhcmlhIikNCg0KI0NhbiBmaWx0ZXIgZm9yIGJvdGggZ2VhcnMgYW5kIHRoZW4gYWRkIGEgdGF4YSBjb2Fyc2Ugb2YgQXBwZW5kaWN1bGFyaWFfbGFyZ2UgYW5kIEFwcGVuZGljdWxhcl9zbWFsbA0KDQpBcHBlbmRpY3VsYXJpYV9sYXJnZSA8LSBmaWx0ZXIoQXBwZW5kaWN1bGFyaWEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI1JlY29kZSBjb2Fyc2UgdGF4YQ0KDQpBcHBlbmRpY3VsYXJpYV9sYXJnZSRUQVhBX0NPQVJTRVtBcHBlbmRpY3VsYXJpYV9sYXJnZSRUQVhBX0NPQVJTRT09IkFwcGVuZGljdWxhcmlhIl0gPC0gIkFwcGVuZGljdWxhcmlhX2xhcmdlIg0KDQoNCkFwcGVuZGljdWxhcmlhX3NtYWxsIDwtIGZpbHRlcihBcHBlbmRpY3VsYXJpYSwgR0VBUl9OQU1FIT0iNjBCT04iKQ0KDQojUmVjb2RlIGNvYXJzZSB0YXhhDQoNCkFwcGVuZGljdWxhcmlhX3NtYWxsJFRBWEFfQ09BUlNFW0FwcGVuZGljdWxhcmlhX3NtYWxsJFRBWEFfQ09BUlNFPT0iQXBwZW5kaWN1bGFyaWEiXSA8LSAiQXBwZW5kaWN1bGFyaWFfc21hbGwiDQoNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEFwcGVuZGljdWxhcmlhX2xhcmdlLCBBcHBlbmRpY3VsYXJpYV9zbWFsbCkNCg0KDQpgYGANCg0KQml2YWx2aWENCg0KDQpgYGB7cn0NCg0KQml2YWx2aWEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQml2YWx2aWEiKQ0KDQojQml2YWx2aWEgZXN0aW1hdGUgZnJvbSBzbWFsbGVyIG5ldHMgb25seQ0KDQpCaXZhbHZpYSA8LSBmaWx0ZXIoQml2YWx2aWEsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQml2YWx2aWEpDQoNCg0KDQoNCmBgYA0KDQoNCkJyYWNoeXVyYQ0KDQpgYGB7cn0NCg0KQnJhY2h5dXJhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkJyYWNoeXVyYSIpDQoNCiNCcmFjaHl1cmEgZXN0aW1hdGUgZnJvbSA2MEJPTiBvbmx5DQoNCkJyYWNoeXVyYSA8LSBmaWx0ZXIoQnJhY2h5dXJhLCBHRUFSX05BTUU9PSI2MEJPTiIpDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCcmFjaHl1cmEpDQoNCg0KDQpgYGANCg0KQ2FsYW51cyBoeXBlcmJvcmV1cw0KDQoNCg0KYGBge3J9DQoNCkNhbGFudXNfaHlwZXJib3JldXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQ2FsYW51cyBoeXBlcmJvcmV1cyIpDQoNCg0KI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scw0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSA8LSBmaWx0ZXIoQ2FsYW51c19oeXBlcmJvcmV1cywgREFUQV9TT1VSQ0U9PSJFTUEiKQ0KQ2FsYW51c19oeXBlcmJvcmV1c19FY29EQUFUIDwtIGZpbHRlcihDYWxhbnVzX2h5cGVyYm9yZXVzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQ0KDQojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQ0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KENhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKENhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQ0KDQojVGhlc2UgbG9vayBjb3JyZWN0DQoNCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMNCg0KI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQ0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19oeXBlcmJvcmV1c19FTUFfYnlHRUFSX05BTUUsIG4oKSkNCg0KI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cw0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSA8LSBmaWx0ZXIoQ2FsYW51c19oeXBlcmJvcmV1c19FTUEsIE1FU0ggIT0gMTUzKQ0KDQoNCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldA0KDQpDYWxhbnVzX2h5cGVyYm9yZXVzIDwtIHJiaW5kKENhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVCwgQ2FsYW51c19oeXBlcmJvcmV1c19FTUEpDQoNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENhbGFudXNfaHlwZXJib3JldXMpDQoNCg0KYGBgDQoNCg0KQ2FsYW51cyBtYXJzaGFsbGFlL2dsYWNpYWxpcw0KDQoNCmBgYHtyfQ0KDQpDYWxhbnVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNhbGFudXMgbWFyc2hhbGxhZS9nbGFjaWFsaXMiKQ0KDQojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzDQoNCkNhbGFudXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVNQSIpDQpDYWxhbnVzX0Vjb0RBQVQgPC0gZmlsdGVyKENhbGFudXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpDQoNCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhDQoNCkNhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoQ2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpDQoNCkNhbGFudXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpDQoNCiNEbyBzb21lIGZpbHRlcmluZyB0byBnZXQgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgZ2VhciBmb3IgRWNvREFBVCBkYXRhDQoNCkNhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJCIikNCkNhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVRfQiwgTUVTSCE9MTUzKQ0KDQpDYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpDQpDYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFUX0MsIE1FU0g9PTE1MykNCkNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVRfQywgR0VBUl9OQU1FPT0iMjBCT04iKQ0KDQpDYWxhbnVzX0Vjb0RBQVRfRyA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRyIpDQoNCkNhbGFudXNfRWNvREFBVF9IIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJIIikNCg0KQ2FsYW51c19FY29EQUFUX0sgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IksiKQ0KDQpDYWxhbnVzX0Vjb0RBQVRfTCA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iTCIpDQoNCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldA0KDQpDYWxhbnVzX0Vjb0RBQVRfRmluYWwgPC0gcmJpbmQoQ2FsYW51c19FY29EQUFUX0IsIENhbGFudXNfRWNvREFBVF9DLCBDYWxhbnVzX0Vjb0RBQVRfRywgQ2FsYW51c19FY29EQUFUX0gsIENhbGFudXNfRWNvREFBVF9LLCBDYWxhbnVzX0Vjb0RBQVRfTCkNCg0KdW5ncm91cChDYWxhbnVzX0Vjb0RBQVRfRmluYWwpDQoNCiNSZW1vdmUgc29tZSBmaWxlcw0KDQpybShDYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBDYWxhbnVzX0Vjb0RBQVRfQiwgQ2FsYW51c19FY29EQUFUX0MsIENhbGFudXNfRWNvREFBVF9HLCBDYWxhbnVzX0Vjb0RBQVRfSCwgQ2FsYW51c19FY29EQUFUX0ssIENhbGFudXNfRWNvREFBVF9MKQ0KDQojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzDQoNCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGENCg0KQ2FsYW51c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoQ2FsYW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkNCg0KQ2FsYW51c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENhbGFudXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpDQoNCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMNCg0KQ2FsYW51c19FTUFfNjBCT04gPC0gZmlsdGVyKENhbGFudXNfRU1BLCBHRUFSX05BTUU9PSI2MEJPTiIpDQoNCkNhbGFudXNfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfNjBCT04sIE1FU0g9PTMzMykNCg0KQ2FsYW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihDYWxhbnVzX0VNQV82MEJPTl8zMzMsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpDQoNCkNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfNjBCT04sIE1FU0g9PTUwNSkNCg0KQ2FsYW51c19FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihDYWxhbnVzX0VNQV82MEJPTl81MDUsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpIikNCg0KQ2FsYW51c19FTUFfMjBCT04gPC0gZmlsdGVyKENhbGFudXNfRU1BLCBHRUFSX05BTUU9PSIyMEJPTiIpDQoNCkNhbGFudXNfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfMjBCT04sIE1FU0g9PTE1MykNCg0KQ2FsYW51c19FTUFfMjBCT05fMTUzIDwtIGZpbHRlcihDYWxhbnVzX0VNQV8yMEJPTl8xNTMsIFNUQUdFX05BTUU9PSJDIC0gMiAoQ09QRVBPRElURSBJSSkifFNUQUdFX05BTUU9PSJDIC0gMSAoQ09QRVBPRElURSBJKSIpDQoNCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldA0KDQpDYWxhbnVzX0VNQV9GaW5hbCA8LSByYmluZChDYWxhbnVzX0VNQV82MEJPTl8zMzMsIENhbGFudXNfRU1BXzYwQk9OXzUwNSwgQ2FsYW51c19FTUFfMjBCT05fMTUzKQ0KDQp1bmdyb3VwKENhbGFudXNfRU1BX0ZpbmFsKQ0KDQojUmVtb3ZlIHNvbWUgZmlsZXMNCg0Kcm0oQ2FsYW51c19FTUFfYnlHRUFSX05BTUUsIENhbGFudXNfRU1BXzIwQk9OLCBDYWxhbnVzX0VNQV8yMEJPTl8xNTMsIENhbGFudXNfRU1BXzYwQk9OLCBDYWxhbnVzX0VNQV82MEJPTl8zMzMsIENhbGFudXNfRU1BXzYwQk9OXzUwNSkNCg0KI0NvbWJpbmUgaW50byBmaW5hbCwgQ2FsYW51cyBkYXRhIHNldA0KDQpDYWxhbnVzIDwtIHJiaW5kKENhbGFudXNfRU1BX0ZpbmFsLCBDYWxhbnVzX0Vjb0RBQVRfRmluYWwpDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDYWxhbnVzKQ0KDQoNCmBgYA0KDQoNCkNhbGFudXMgcGFjaWZpY3VzDQoNCg0KYGBge3J9DQoNCkNhbGFudXNfcGFjaWZpY3VzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ2FsYW51cyBwYWNpZmljdXMiKQ0KDQoNCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMNCg0KQ2FsYW51c19wYWNpZmljdXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzX3BhY2lmaWN1cywgREFUQV9TT1VSQ0U9PSJFTUEiKQ0KQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVCA8LSBmaWx0ZXIoQ2FsYW51c19wYWNpZmljdXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpDQoNCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhDQoNCkNhbGFudXNfcGFjaWZpY3VzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KENhbGFudXNfcGFjaWZpY3VzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkNCg0KQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQ0KDQojU3RhZ2VzIGFuZCBnZWFyIGFyZSBjb3JyZWN0IGZvciBFY29EQUFUIGRhdGENCg0KDQojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzDQoNCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGENCg0KQ2FsYW51c19wYWNpZmljdXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KENhbGFudXNfcGFjaWZpY3VzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpDYWxhbnVzX3BhY2lmaWN1c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENhbGFudXNfcGFjaWZpY3VzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQ0KDQojIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMsIGp1c3QgcmVtb3ZlIG9uZSBKdWRheSBzYW1wbGUNCg0KQ2FsYW51c19wYWNpZmljdXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzX3BhY2lmaWN1c19FTUEsIEdFQVJfTkFNRSE9Ikp1ZGF5IikNCg0KDQoNCiNDb21iaW5lIGludG8gZmluYWwsIENhbGFudXNfcGFjaWZpY3VzIGRhdGEgc2V0DQoNCkNhbGFudXNfcGFjaWZpY3VzIDwtIHJiaW5kKENhbGFudXNfcGFjaWZpY3VzX0VNQSwgQ2FsYW51c19wYWNpZmljdXNfRWNvREFBVCkNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENhbGFudXNfcGFjaWZpY3VzKQ0KDQoNCg0KDQpgYGANCg0KQ2FyaWRlYQ0KDQpgYGB7cn0NCg0KQ2FyaWRlYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0UgPT0gIkNhcmlkZWEiKQ0KDQojQ2FyaWRlYSBlc3RpbWF0ZSBmcm9tIGxhcmdlciBuZXRzIG9ubHkNCg0KQ2FyaWRlYSA8LSBmaWx0ZXIoQ2FyaWRlYSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2FyaWRlYSkNCg0KDQpgYGANCkNlbnRyb3BhZ2VzIGFiZG9taW5hbGlzDQoNCmBgYHtyfQ0KDQpDZW50cm9wYWdlcyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJDZW50cm9wYWdlcyBhYmRvbWluYWxpcyIpDQoNCg0KI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scw0KDQpDZW50cm9wYWdlc19FTUEgPC0gZmlsdGVyKENlbnRyb3BhZ2VzLCBEQVRBX1NPVVJDRT09IkVNQSIpDQpDZW50cm9wYWdlc19FY29EQUFUIDwtIGZpbHRlcihDZW50cm9wYWdlcywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikNCg0KI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGENCg0KQ2VudHJvcGFnZXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoQ2VudHJvcGFnZXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpDZW50cm9wYWdlc19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShDZW50cm9wYWdlc19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpDQoNCg0KI0ZpbHRlciBmb3IgY29ycmVjdCBHRUFSX05BTUUgYW5kIE1FU0ggZnJvbSBFY29EQUFUDQoNCkNlbnRyb3BhZ2VzX0Vjb0RBQVQgPC0gZmlsdGVyKENlbnRyb3BhZ2VzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0hPSJHIikNCg0KDQojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzDQoNCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGENCg0KQ2VudHJvcGFnZXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KENlbnRyb3BhZ2VzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpDZW50cm9wYWdlc19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENlbnRyb3BhZ2VzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQ0KDQojRm9yIGNvbnNpc3RlbmN5LCBzZWxlY3QgdGhlIHNtYWxsZXIgZ2VhciBvbmx5DQoNCkNlbnRyb3BhZ2VzX0VNQSA8LSBmaWx0ZXIoQ2VudHJvcGFnZXNfRU1BLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCg0KI1JlY29tYmluZWQgZGF0YQ0KDQpDZW50cm9wYWdlcyA8LSByYmluZChDZW50cm9wYWdlc19FY29EQUFULCBDZW50cm9wYWdlc19FTUEpDQoNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2VudHJvcGFnZXMpDQoNCg0KDQoNCg0KYGBgDQoNCkNoYWV0b2duYXRoYQ0KDQpgYGB7cn0NCg0KQ2hhZXRvZ25hdGhhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNoYWV0b2duYXRoYSIpDQoNCiNGaWx0ZXIgZm9yIENoYWV0b2duYXRoYSBmcm9tIHRoZSA2MEJPTiBuZXRzIG9ubHkNCg0KQ2hhZXRvZ25hdGhhIDwtIGZpbHRlcihDaGFldG9nbmF0aGEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENoYWV0b2duYXRoYSkNCg0KDQoNCmBgYA0KDQpDaXJyaXBlZGlhDQoNCmBgYHtyfQ0KDQpDaXJyaXBlZGlhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ2lycmlwZWRpYSIpDQoNCiNDYW4gZmlsdGVyIGZvciBib3RoIGdlYXJzIGFuZCB0aGVuIGFkZCBhIHRheGEgY29hcnNlIG9mIENpcnJpcGVkaWFfbGFyZ2UgYW5kIENpcnJpcGVkaWFfc21hbGwNCg0KQ2lycmlwZWRpYV9sYXJnZSA8LSBmaWx0ZXIoQ2lycmlwZWRpYSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQojUmVjb2RlIGNvYXJzZSB0YXhhDQoNCkNpcnJpcGVkaWFfbGFyZ2UkVEFYQV9DT0FSU0VbQ2lycmlwZWRpYV9sYXJnZSRUQVhBX0NPQVJTRT09IkNpcnJpcGVkaWEiXSA8LSAiQ2lycmlwZWRpYV9sYXJnZSINCg0KDQpDaXJyaXBlZGlhX3NtYWxsIDwtIGZpbHRlcihDaXJyaXBlZGlhLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCiNSZWNvZGUgY29hcnNlIHRheGENCg0KQ2lycmlwZWRpYV9zbWFsbCRUQVhBX0NPQVJTRVtDaXJyaXBlZGlhX3NtYWxsJFRBWEFfQ09BUlNFPT0iQ2lycmlwZWRpYSJdIDwtICJDaXJyaXBlZGlhX3NtYWxsIg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2lycmlwZWRpYV9sYXJnZSwgQ2lycmlwZWRpYV9zbWFsbCkNCg0KDQoNCg0KYGBgDQoNCkNsYWRvY2VyYQ0KDQpgYGB7cn0NCg0KQ2xhZG9jZXJhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNsYWRvY2VyYSIpDQoNCiNDbGFkb2NlcmEgZnJvbXQgaGUgc21hbGwgbmV0IG9ubHkNCg0KI0ZpbHRlciBmb3IgY29ycmVjdCBnZWFyDQoNCkNsYWRvY2VyYSA8LSBmaWx0ZXIoQ2xhZG9jZXJhLCBHRUFSX05BTUUhPSAiNjBCT04iKQ0KDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDbGFkb2NlcmEpDQoNCg0KYGBgDQoNCkNsaW9uZSBsaW1hY2luYQ0KDQpgYGB7cn0NCg0KQ2xpb25lIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNsaW9uZSBsaW1hY2luYSIpDQoNCiNFc3RpbWF0ZSBmcm9tIHRoZSBsYXJnZXIgbmV0IG9ubHkNCg0KQ2xpb25lIDwtIGZpbHRlcihDbGlvbmUsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2xpb25lKQ0KDQoNCg0KDQoNCmBgYA0KDQpDbmlkYXJpYQ0KDQpgYGB7cn0NCg0KQ25pZGFyaWEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFID09ICJDbmlkYXJpYSIpDQoNCiNDYW4gZmlsdGVyIGZvciBib3RoIGdlYXJzIGFuZCB0aGVuIGFkZCBhIHRheGEgY29hcnNlIG9mIENuaWRhcmlhX2xhcmdlIGFuZCBDbmlkYXJpYV9zbWFsbA0KDQpDbmlkYXJpYV9sYXJnZSA8LSBmaWx0ZXIoQ25pZGFyaWEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI1JlY29kZSBjb2Fyc2UgdGF4YQ0KDQpDbmlkYXJpYV9sYXJnZSRUQVhBX0NPQVJTRVtDbmlkYXJpYV9sYXJnZSRUQVhBX0NPQVJTRT09IkNuaWRhcmlhIl0gPC0gIkNuaWRhcmlhX2xhcmdlIg0KDQoNCkNuaWRhcmlhX3NtYWxsIDwtIGZpbHRlcihDbmlkYXJpYSwgR0VBUl9OQU1FIT0iNjBCT04iKQ0KDQojUmVjb2RlIGNvYXJzZSB0YXhhDQoNCkNuaWRhcmlhX3NtYWxsJFRBWEFfQ09BUlNFW0NuaWRhcmlhX3NtYWxsJFRBWEFfQ09BUlNFPT0iQ25pZGFyaWEiXSA8LSAiQ25pZGFyaWFfc21hbGwiDQoNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENuaWRhcmlhX2xhcmdlLCBDbmlkYXJpYV9zbWFsbCkNCg0KDQoNCmBgYA0KDQpTbWFsbCBhbmQgbGFyZ2UgY29wZXBvZHMgdGhhdCBkbyBub3QgYmVsb25nIHRvIG1ham9yIHRheG9ub21pYyBncm91cA0KDQoNCmBgYHtyfQ0KDQoNCkNvcGVwb2Rfc21hbGwgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFID09ICJDb3BlcG9kX3NtYWxsIikNCg0KI0ZpbHRlciBmb3IgdGhlIHNtYWxsZXIgbWVzaCBnZWFycyBvbmx5DQoNCkNvcGVwb2Rfc21hbGwgPC0gZmlsdGVyKENvcGVwb2Rfc21hbGwsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KI05vdyBidWlsZCB0aGUgbGFyZ2UgZGF0YXNldA0KDQpDb3BlcG9kX2xhcmdlIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ29wZXBvZF9sYXJnZSIpDQoNCiNGaWx0ZXIgZm9yIHRoZSBzbWFsbGVyIG1lc2ggZ2VhcnMgb25seQ0KDQpDb3BlcG9kX2xhcmdlIDwtIGZpbHRlcihDb3BlcG9kX2xhcmdlLCBHRUFSX05BTUU9PSI2MEJPTiIpDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDb3BlcG9kX2xhcmdlLCBDb3BlcG9kX3NtYWxsKQ0KDQoNCg0KYGBgDQoNCg0KQ3Rlbm9waG9yYQ0KDQpgYGB7cn0NCg0KQ3Rlbm9waG9yYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJDdGVub3Bob3JhIikNCg0KI0ZpbHRlciBmb3IgdGhlIGxhcmdlIG5ldCBvbmx5DQoNCkN0ZW5vcGhvcmEgPC0gZmlsdGVyKEN0ZW5vcGhvcmEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEN0ZW5vcGhvcmEpDQoNCg0KDQpgYGANCg0KDQpDdW1hY2VhDQoNCmBgYHtyfQ0KDQpDdW1hY2VhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkN1bWFjZWEiKQ0KDQojRmlsdGVyIGZvciB0aGUgbGFyZ2UgbmV0IG9ubHkNCg0KQ3VtYWNlYSA8LSBmaWx0ZXIoQ3VtYWNlYSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ3VtYWNlYSkNCg0KDQoNCmBgYA0KDQoNCkRlY2Fwb2RhDQoNCg0KYGBge3J9DQoNCkRlY2Fwb2RhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkRlY2Fwb2RhIikNCg0KI1ZlcnkgZmV3IG1lYXN1cmVtZW50cyBvZiB1bmlkZW50ZmllZCBkZWNhcG9kcy4gV2UgY2FuIGlnbm9yZQ0KDQpgYGANCg0KDQpFY2hpbm9kZXJtYXRhDQoNCmBgYHtyfQ0KDQpFY2hpbm9kZXJtYXRhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkVjaGlub2Rlcm1hdGEiKQ0KDQojRWNoaW5vZGVybWF0YSBhcmUgdGlueSwgZmlsdGVyIGZyb20gc21hbGwgbmV0cyBvbmx5DQoNCkVjaGlub2Rlcm1hdGEgPC0gZmlsdGVyKEVjaGlub2Rlcm1hdGEsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEVjaGlub2Rlcm1hdGEpDQoNCg0KDQoNCmBgYA0KDQoNCkVwaWxhYmlkb2NlcmEgbG9uZ2lwZWRhdGENCg0KYGBge3J9DQoNCkVwaWxhYmlkb2NlcmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRXBpbGFiaWRvY2VyYSBsb25naXBlZGF0YSIpDQoNCg0KI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scw0KDQpFcGlsYWJpZG9jZXJhX0VNQSA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYSwgREFUQV9TT1VSQ0U9PSJFTUEiKQ0KRXBpbGFiaWRvY2VyYV9FY29EQUFUIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQ0KDQojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQ0KDQpFcGlsYWJpZG9jZXJhX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KEVwaWxhYmlkb2NlcmFfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpFcGlsYWJpZG9jZXJhX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKEVwaWxhYmlkb2NlcmFfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQ0KDQojVGhpbmdzIGFyZSBjb3JyZWN0IGZvciB0aGUgRWNvREFBVCBkYXRhLCBub3QgbG9vayBhdCB0aGUgRU1BIGRhdGENCg0KDQojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzDQoNCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGENCg0KRXBpbGFiaWRvY2VyYV9FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoRXBpbGFiaWRvY2VyYV9FTUEsIE1FU0gsIEdFQVJfTkFNRSkNCg0KRXBpbGFiaWRvY2VyYV9FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKEVwaWxhYmlkb2NlcmFfRU1BX2J5R0VBUl9OQU1FLCBuKCkpDQoNCg0KDQojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzDQoNCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQpFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OLCBNRVNIPT0zMzMpDQoNCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fMzMzLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQ0KDQpFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OLCBNRVNIPT01MDUpDQoNCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fNTA1LCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSIpDQoNCkVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQSwgR0VBUl9OQU1FPT0iMjBCT04iKQ0KDQpFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OLCBNRVNIPT0xNTMpDQoNCkVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfMjBCT05fMTUzLCBTVEFHRV9OQU1FPT0iQyAtIDIgKENPUEVQT0RJVEUgSUkpInxTVEFHRV9OQU1FPT0iQyAtIDEgKENPUEVQT0RJVEUgSSkiKQ0KDQojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQNCg0KRXBpbGFiaWRvY2VyYV9FTUFfRmluYWwgPC0gcmJpbmQoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fMzMzLCBFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl81MDUsIEVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OXzE1MykNCg0KdW5ncm91cChFcGlsYWJpZG9jZXJhX0VNQV9GaW5hbCkNCg0KI1JlbW92ZSBzb21lIGZpbGVzDQoNCnJtKEVwaWxhYmlkb2NlcmFfRU1BX2J5R0VBUl9OQU1FLCBFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTiwgRXBpbGFiaWRvY2VyYV9FTUFfMjBCT05fMTUzLCBFcGlsYWJpZG9jZXJhX0VNQV82MEJPTiwgRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fMzMzLCBFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl81MDUpDQoNCiNDb21iaW5lIGludG8gZmluYWwsIEVwaWxhYmlkb2NlcmEgZGF0YSBzZXQNCg0KRXBpbGFiaWRvY2VyYSA8LSByYmluZChFcGlsYWJpZG9jZXJhX0VNQV9GaW5hbCwgRXBpbGFiaWRvY2VyYV9FY29EQUFUKQ0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRXBpbGFiaWRvY2VyYSkNCg0KDQpgYGANCg0KRXVjYWxhbnVzIGJ1bmdpaQ0KDQpgYGB7cn0NCg0KRXVjYWxhbnVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1Y2FsYW51cyBidW5naWkiKQ0KDQoNCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMNCg0KRXVjYWxhbnVzX0VNQSA8LSBmaWx0ZXIoRXVjYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVNQSIpDQpFdWNhbGFudXNfRWNvREFBVCA8LSBmaWx0ZXIoRXVjYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQ0KDQojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQ0KDQpFdWNhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoRXVjYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkNCg0KRXVjYWxhbnVzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKEV1Y2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpDQoNCg0KDQojRG8gc29tZSBmaWx0ZXJpbmcgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0YWdlcyBmcm9tIHRoZSBjb3JyZWN0IGdlYXIgZm9yIEVjb0RBQVQgZGF0YQ0KDQpFdWNhbGFudXNfRWNvREFBVF9BIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkEiKQ0KRXVjYWxhbnVzX0Vjb0RBQVRfQSA8LSBmaWx0ZXIoRXVjYWxhbnVzX0Vjb0RBQVRfQSwgTUVTSCE9MTUzKQ0KDQpFdWNhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQ0KRXVjYWxhbnVzX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoRXVjYWxhbnVzX0Vjb0RBQVRfQiwgTUVTSCE9MTUzKQ0KDQpFdWNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkMiKQ0KRXVjYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoRXVjYWxhbnVzX0Vjb0RBQVRfQywgTUVTSD09MTUzKQ0KDQpFdWNhbGFudXNfRWNvREFBVF9GIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkYiKQ0KDQoNCkV1Y2FsYW51c19FY29EQUFUX0cgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRyIpDQoNCkV1Y2FsYW51c19FY29EQUFUX0ggPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSCIpDQoNCkV1Y2FsYW51c19FY29EQUFUX0sgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSyIpDQoNCkV1Y2FsYW51c19FY29EQUFUX0wgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iTCIpDQoNCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldA0KDQpFdWNhbGFudXNfRWNvREFBVF9GaW5hbCA8LSByYmluZChFdWNhbGFudXNfRWNvREFBVF9BLCBFdWNhbGFudXNfRWNvREFBVF9CLCBFdWNhbGFudXNfRWNvREFBVF9DLCBFdWNhbGFudXNfRWNvREFBVF9GLCAgRXVjYWxhbnVzX0Vjb0RBQVRfRywgRXVjYWxhbnVzX0Vjb0RBQVRfSCwgRXVjYWxhbnVzX0Vjb0RBQVRfSywgRXVjYWxhbnVzX0Vjb0RBQVRfTCkNCg0KdW5ncm91cChFdWNhbGFudXNfRWNvREFBVF9GaW5hbCkNCg0KI1JlbW92ZSBzb21lIGZpbGVzDQoNCnJtKEV1Y2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSwgRXVjYWxhbnVzX0Vjb0RBQVRfQSwgRXVjYWxhbnVzX0Vjb0RBQVRfQiwgRXVjYWxhbnVzX0Vjb0RBQVRfQywgRXVjYWxhbnVzX0Vjb0RBQVRfRiwgRXVjYWxhbnVzX0Vjb0RBQVRfRywgRXVjYWxhbnVzX0Vjb0RBQVRfSCwgRXVjYWxhbnVzX0Vjb0RBQVRfSywgRXVjYWxhbnVzX0Vjb0RBQVRfTCkNCg0KDQoNCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMNCg0KI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQ0KDQpFdWNhbGFudXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KEV1Y2FsYW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkNCg0KRXVjYWxhbnVzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoRXVjYWxhbnVzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQ0KDQojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzDQoNCkV1Y2FsYW51c19FTUFfNjBCT04gPC0gZmlsdGVyKEV1Y2FsYW51c19FTUEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KRXVjYWxhbnVzX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfNjBCT04sIE1FU0g9PTMzMykNCg0KRXVjYWxhbnVzX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfNjBCT05fMzMzLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQ0KDQpFdWNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQV82MEJPTiwgTUVTSD09NTA1KQ0KDQpFdWNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQV82MEJPTl81MDUsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpDQoNCkV1Y2FsYW51c19FTUFfMjBCT04gPC0gZmlsdGVyKEV1Y2FsYW51c19FTUEsIEdFQVJfTkFNRT09IjIwQk9OIikNCg0KRXVjYWxhbnVzX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfMjBCT04sIE1FU0g9PTE1MykNCg0KRXVjYWxhbnVzX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfMjBCT05fMTUzLCBTVEFHRV9OQU1FPT0iQyAtIDIgKENPUEVQT0RJVEUgSUkpInxTVEFHRV9OQU1FPT0iQyAtIDEgKENPUEVQT0RJVEUgSSkiKQ0KDQojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQNCg0KRXVjYWxhbnVzX0VNQV9GaW5hbCA8LSByYmluZChFdWNhbGFudXNfRU1BXzYwQk9OXzMzMywgRXVjYWxhbnVzX0VNQV82MEJPTl81MDUsIEV1Y2FsYW51c19FTUFfMjBCT05fMTUzKQ0KDQp1bmdyb3VwKEV1Y2FsYW51c19FTUFfRmluYWwpDQoNCiNSZW1vdmUgc29tZSBmaWxlcw0KDQpybShFdWNhbGFudXNfRU1BX2J5R0VBUl9OQU1FLCBFdWNhbGFudXNfRU1BXzIwQk9OLCBFdWNhbGFudXNfRU1BXzIwQk9OXzE1MywgRXVjYWxhbnVzX0VNQV82MEJPTiwgRXVjYWxhbnVzX0VNQV82MEJPTl8zMzMsIEV1Y2FsYW51c19FTUFfNjBCT05fNTA1KQ0KDQojQ29tYmluZSBpbnRvIGZpbmFsLCBFdWNhbGFudXMgZGF0YSBzZXQNCg0KRXVjYWxhbnVzIDwtIHJiaW5kKEV1Y2FsYW51c19FTUFfRmluYWwsIEV1Y2FsYW51c19FY29EQUFUX0ZpbmFsKQ0KDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFdWNhbGFudXMpDQoNCg0KDQpgYGANCg0KRXVwaGF1c2lhY2VhIHBhY2lmaWNhIA0KDQpgYGB7cn0NCg0KRV9wYWNpZmljYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJFdXBoYXVzaWEgcGFjaWZpY2EiKQ0KDQojRmlsdGVyIGZvciBsYXJnZSBuZXQgb25seSBhbmQgc3RhZ2VzIGFyZSBhZHVsdCBhbmQganV2ZW5pbGUNCg0KRV9wYWNpZmljYSA8LSBmaWx0ZXIoRV9wYWNpZmljYSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRV9wYWNpZmljYSkNCg0KDQoNCmBgYA0KDQoNCkV1cGhhdXNpYWNlYQ0KDQpgYGB7cn0NCg0KRXVwaGF1c2lhY2VhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1cGhhdXNpYWNlYSIpDQoNCiNGaXJzdCBzZXBhcmF0ZSBvdXQgdGhlIGFkdWx0cyBiZWxvbmdpbmcgdG8gVGVzc2FyYnJhbmNoaW9uIG9jdWxhdHVtDQoNCgkNClRlc3NhcmFicmFjaGlvbl9vY3VsYXR1bSA8LSBmaWx0ZXIgKEV1cGhhdXNpYWNlYSwgVEFYT05fTkFNRT09IlRlc3NhcmFicmFjaGlvbiBvY3VsYXR1bSIpDQoNCg0KI05vdyBmaWx0ZXIgdGhlIEV1cGhhdXNpYWNlYSBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGFuZCBuZXRzDQoNCkV1cGhhdXNpYWNlYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBUQVhPTl9OQU1FIT0iVGVzc2FyYWJyYWNoaW9uIG9jdWxhdHVtIikNCg0KI0VsaW1pbmF0ZSBhZHVsdCBhbmQganV2ZW5pbGUgc3RhZ2VzLCB0aG9zZSBzaG91bGQgYmUgaWRlbnRpZmllZCB0byBzcGVjaWVzDQoNCkV1cGhhdXNpYWNlYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBTVEFHRV9OQU1FIT0gIkEgKyBKIChBRFVMVC9KVVZFTklMRSkiKQ0KDQpFdXBoYXVzaWFjZWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRSE9ICJKVVZFTklMRSIpDQoNCiNHZXQgcmlkIG9mIHRoZSBOT1QgREVURVJNSU5FRA0KDQpFdXBoYXVzaWFjZWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRSE9Ik5PVCBERVRFUk1JTkVEIikNCg0KI0dldCByaWQgb2YgdGhlIEVHRw0KDQpFdXBoYXVzaWFjZWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRSE9IkVHRyIpDQoNCg0KI05vdyBjcmVhdGUgdGhlIGZ1cmNpbGlhIGRhdGFzZXQNCg0KRXVwaGF1c2lhY2VhX2Z1cmNpbGlhIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUU9PSJGVVJDSUxJQSIpDQoNCkV1cGhhdXNpYWNlYV9mdXJjaWxpYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBHRUFSX05BTUU9PSI2MEJPTiIpDQoNCg0KI05vdyBjcmVhdGUgdGhlIGNhbHl0b3BpcyBkYXRhc2V0DQoNCkV1cGhhdXNpYWNlYV9jYWx5cHRvcGlzIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkifFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIDEifFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIDIifFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIDMiKQ0KDQoNCiNOb3cgY3JlYXRlIHRoZSBuYXVwbGl1cyBkYXRhc2V0DQoNCkV1cGhhdXNpYWNlYV9uYXVwbGl1cyA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBTVEFHRV9OQU1FPT0iTkFVUExJVVMiKQ0KDQojRmlsdGVyIGZvciBzbWFsbCBuZXRzIG9ubHkNCg0KRXVwaGF1c2lhY2VhX25hdXBsaXVzIDwtIGZpbHRlcihFdXBoYXVzaWFjZWFfbmF1cGxpdXMsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRXVwaGF1c2lhY2VhX2Z1cmNpbGlhLCBFdXBoYXVzaWFjZWFfY2FseXB0b3BpcywgRXVwaGF1c2lhY2VhX25hdXBsaXVzKQ0KDQoNCg0KYGBgDQoNCg0KRXVyeXRlbW9yYSBzcHAuDQoNCmBgYHtyfQ0KDQpFdXJ5dGVtb3JhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1cnl0ZW1vcmEgc3BwLiIpDQoNCiNGaWx0ZXIgZnJvbSB0aGUgc21hbGwgbmV0cyBvbmx5DQoNCkV1cnl0ZW1vcmEgPC0gZmlsdGVyKEV1cnl0ZW1vcmEsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgRXVyeXRlbW9yYSkNCg0KDQoNCmBgYA0KDQoNCkdhc3Ryb3BvZGENCg0KDQpgYGB7cn0NCg0KR2FzdHJvcG9kYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJHYXN0cm9wb2RhIikNCg0KI1VuaWRlbnRpZmllZCBnYXN0cm9wb2RzLCBjYW4gcmVtb3ZlIGZyb20gZmluYWwgZGF0YXNldA0KDQoNCmBgYA0KDQoNCkxpbWFjaW5hIGhlbGljaW5hDQoNCg0KYGBge3J9DQoNCkxpbWFjaW5hIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkxpbWFjaW5hIGhlbGljaW5hIikNCg0KI0NhbiBzcGxpdCBpbnRvIGVzdGlhbXRlcyBmcm9tIGxhcmdlIGFuZCBzbWFsbCBuZXRzDQoNCg0KTGltYWNpbmFfbGFyZ2UgPC0gZmlsdGVyKExpbWFjaW5hLCBHRUFSX05BTUU9PSI2MEJPTiIpDQoNCiNSZW5hbWUgdGhlIGNvYXJzZSB0YXhhDQoNCkxpbWFjaW5hX2xhcmdlJFRBWEFfQ09BUlNFW0xpbWFjaW5hX2xhcmdlJFRBWEFfQ09BUlNFPT0iTGltYWNpbmEgaGVsaWNpbmEiXSA8LSAiTGltYWNpbmFfbGFyZ2UiDQoNCiNOb3cgZG8gdGhlIHNtYWxsIG5ldHMNCg0KTGltYWNpbmFfc21hbGwgPC0gZmlsdGVyKExpbWFjaW5hLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCiNSZW5hbWUgdGhlIGNvYXJzZSB0YXhhDQoNCkxpbWFjaW5hX3NtYWxsJFRBWEFfQ09BUlNFW0xpbWFjaW5hX3NtYWxsJFRBWEFfQ09BUlNFPT0iTGltYWNpbmEgaGVsaWNpbmEiXSA8LSAiTGltYWNpbmFfc21hbGwiDQoNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIExpbWFjaW5hX2xhcmdlLCBMaW1hY2luYV9zbWFsbCkNCg0KDQoNCmBgYA0KDQpNZXRyaWRpYSBsb25nYQ0KDQpgYGB7cn0NCg0KTWV0cmlkaWFfbG9uZ2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgbG9uZ2EiKQ0KDQojQWR1bHRzLCBDNSBvbmx5IHNvIGFsbCBpcyBnb29kLCBjYW4gYWRkIHRvIGZ1bGwgZGF0YSBzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgTWV0cmlkaWFfbG9uZ2EpDQoNCg0KYGBgDQoNCg0KTWV0cmlkaWEgb2tob3RlbnNpcw0KDQoNCmBgYHtyfQ0KDQpNZXRyaWRpYV9va2hvdGVuc2lzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik1ldHJpZGlhIG9raG90ZW5zaXMiKQ0KDQoNCiNBZHVsdHMsIEM0LCBhbmQgQzUgb25seSBzbyBhbGwgaXMgZ29vZCwgY2FuIGFkZCB0byBmdWxsIGRhdGEgc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIE1ldHJpZGlhX29raG90ZW5zaXMpDQoNCg0KDQoNCmBgYA0KDQpNZXRyaWRpYSBwYWNpZmljYQ0KDQoNCmBgYHtyfQ0KDQpNZXRyaWRpYV9wYWNpZmljYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJNZXRyaWRpYSBwYWNpZmljYSIpDQoNCg0KI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scw0KDQpNZXRyaWRpYV9wYWNpZmljYV9FTUEgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhLCBEQVRBX1NPVVJDRT09IkVNQSIpDQpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYSwgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikNCg0KI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGENCg0KTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpDQoNCiNEbyBzb21lIGZpbHRlcmluZyB0byBnZXQgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgZ2VhciBmb3IgRWNvREFBVCBkYXRhDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQ0KTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9CIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0IsIE1FU0ghPTE1MykNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9DIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRyA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkciKQ0KDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQ0KDQojUmVtb3ZlIEMzIHN0YWdlDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ILCBTVEFHRV9OQU1FIT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpDQoNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9LIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSyIpDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfTCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkwiKQ0KDQojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9GaW5hbCA8LSByYmluZChNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0IsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9HLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0gsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9MKQ0KDQp1bmdyb3VwKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRmluYWwpDQoNCiNSZW1vdmUgc29tZSBmaWxlcw0KDQpybShNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSwgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9CLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0MsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9ILCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0ssIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfTCkNCg0KI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcw0KDQojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShNZXRyaWRpYV9wYWNpZmljYV9FTUEsIE1FU0gsIEdFQVJfTkFNRSkNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShNZXRyaWRpYV9wYWNpZmljYV9FTUFfYnlHRUFSX05BTUUsIG4oKSkNCg0KI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cw0KDQpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04gPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04sIE1FU0g9PTMzMykNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzMzMywgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikiKQ0KDQpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04sIE1FU0g9PTUwNSkNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzUwNSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikiKQ0KDQoNCg0KTWV0cmlkaWFfcGFjaWZpY2FfRU1BX3NtYWxsbmV0cyA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMsIFNUQUdFX05BTUU9PSJDIC0gMSAoQ09QRVBPRElURSBJKSJ8U1RBR0VfTkFNRT09IkMgLSAyIChDT1BFUE9ESVRFIElJKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQ0KDQojUmVuYW1lIE1ldHJpZGlhIHBhY2lmaWMgb2YgZWFybHkgc3RhZ2VzIGFzIE1ldHJpZGlhIHNwcC4NCg0KTWV0cmlkaWFfcGFjaWZpY2FfRU1BX3NtYWxsbmV0cyRUQVhBX0NPQVJTRVtNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzJFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgcGFjaWZpY2EiXSA8LSAiTWV0cmlkaWEgc3BwLiINCg0KI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0DQoNCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV9GaW5hbCA8LSByYmluZChNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fMzMzLCBNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fNTA1LCBNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzKQ0KDQp1bmdyb3VwKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9GaW5hbCkNCg0KI1JlbW92ZSBzb21lIGZpbGVzDQoNCnJtKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9ieUdFQVJfTkFNRSwgTWV0cmlkaWFfcGFjaWZpY2FfRU1BX3NtYWxsbmV0cywgTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OLCBNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fMzMzLCBNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fNTA1KQ0KDQojQ29tYmluZSBpbnRvIGZpbmFsLCBNZXRyaWRpYV9wYWNpZmljYSBkYXRhIHNldA0KDQpNZXRyaWRpYV9wYWNpZmljYSA8LSByYmluZChNZXRyaWRpYV9wYWNpZmljYV9FTUFfRmluYWwsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRmluYWwpDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNZXRyaWRpYV9wYWNpZmljYSkNCg0KDQpgYGANCg0KTWV0cmlkaWEgc3BwLg0KDQpgYGB7cn0NCg0KTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik1ldHJpZGlhIHNwcC4iKQ0KDQojRmlsdGVyIGZvciB0aGUgc21hbGwgbmV0cyBvbmx5DQoNCk1ldHJpZGlhX3NwcCA8LSBmaWx0ZXIoTWV0cmlkaWFfc3BwLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCiNOb3cgZmlsdGVyIG91dCB0aGUgc3RhZ2VzIHRoYXQgYXJlIGFjY3VyYXRlIGZvciB0aGUgc21hbGwgbmV0cywgYW55dGhpbmcgbGVzcyB0aGFuIHN0YWdlIEMtMw0KDQpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE1ldHJpZGlhX3NwcCwgU1RBR0VfTkFNRSE9ICJDLTEgVE8gQy01IikNCk1ldHJpZGlhX3NwcCA8LSBmaWx0ZXIoTWV0cmlkaWFfc3BwLCBTVEFHRV9OQU1FIT0gIkMzLTQiKQ0KTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihNZXRyaWRpYV9zcHAsIFNUQUdFX05BTUUhPSAiQzMtNSIpDQpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE1ldHJpZGlhX3NwcCwgU1RBR0VfTkFNRSE9ICJDIC0gNCAoQ09QRVBPRElURSBJVikiKQ0KDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNZXRyaWRpYV9zcHApDQoNCg0KYGBgDQoNCg0KTXlzaWRzDQoNCmBgYHtyfQ0KDQpNeXNpZGFlIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik15c2lkYWUiKQ0KDQojRmlsdGVyIGZvciA2MEJPTiBuZXRzIG9ubHkNCg0KTXlzaWRhZSA8LSBmaWx0ZXIoTXlzaWRhZSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNeXNpZGFlKQ0KDQoNCg0KYGBgDQoNCg0KDQpOZW9jYWxhbnVzIGNyaXN0YXR1cw0KDQpgYGB7cn0NCg0KQ3Jpc3RhdHVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik5lb2NhbGFudXMgY3Jpc3RhdHVzIikNCg0KDQojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzDQoNCkNyaXN0YXR1c19FTUEgPC0gZmlsdGVyKENyaXN0YXR1cywgREFUQV9TT1VSQ0U9PSJFTUEiKQ0KQ3Jpc3RhdHVzX0Vjb0RBQVQgPC0gZmlsdGVyKENyaXN0YXR1cywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikNCg0KI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGENCg0KQ3Jpc3RhdHVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpDQoNCkNyaXN0YXR1c19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShDcmlzdGF0dXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQ0KDQojRG8gc29tZSBmaWx0ZXJpbmcgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0YWdlcyBmcm9tIHRoZSBjb3JyZWN0IGdlYXIgZm9yIEVjb0RBQVQgZGF0YQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9BIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkEiKQ0KQ3Jpc3RhdHVzX0Vjb0RBQVRfQSA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVRfQSwgTUVTSCE9MTUzKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9CIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQ0KQ3Jpc3RhdHVzX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVRfQiwgTUVTSCE9MTUzKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9DIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkMiKQ0KQ3Jpc3RhdHVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVRfQywgTUVTSD09MTUzKQ0KQ3Jpc3RhdHVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVRfQywgR0VBUl9OQU1FPT0iMjBCT04iKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9GIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkYiKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9HIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkciKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9IIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9LIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IksiKQ0KDQpDcmlzdGF0dXNfRWNvREFBVF9MIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkwiKQ0KDQojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQNCg0KQ3Jpc3RhdHVzX0Vjb0RBQVRfRmluYWwgPC0gcmJpbmQoQ3Jpc3RhdHVzX0Vjb0RBQVRfQSwgQ3Jpc3RhdHVzX0Vjb0RBQVRfQiwgQ3Jpc3RhdHVzX0Vjb0RBQVRfQywgQ3Jpc3RhdHVzX0Vjb0RBQVRfRiwgQ3Jpc3RhdHVzX0Vjb0RBQVRfRywgQ3Jpc3RhdHVzX0Vjb0RBQVRfSCwgQ3Jpc3RhdHVzX0Vjb0RBQVRfSywgQ3Jpc3RhdHVzX0Vjb0RBQVRfTCkNCg0KdW5ncm91cChDcmlzdGF0dXNfRWNvREFBVF9GaW5hbCkNCg0KI1JlbW92ZSBzb21lIGZpbGVzDQoNCnJtKENyaXN0YXR1c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSwgQ3Jpc3RhdHVzX0Vjb0RBQVRfQSwgQ3Jpc3RhdHVzX0Vjb0RBQVRfQiwgQ3Jpc3RhdHVzX0Vjb0RBQVRfQywgQ3Jpc3RhdHVzX0Vjb0RBQVRfRiwgQ3Jpc3RhdHVzX0Vjb0RBQVRfRywgQ3Jpc3RhdHVzX0Vjb0RBQVRfSCwgQ3Jpc3RhdHVzX0Vjb0RBQVRfSywgQ3Jpc3RhdHVzX0Vjb0RBQVRfTCkNCg0KI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcw0KDQojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhDQoNCkNyaXN0YXR1c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoQ3Jpc3RhdHVzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQ0KDQpDcmlzdGF0dXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShDcmlzdGF0dXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpDQoNCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMNCg0KQ3Jpc3RhdHVzX0VNQV9GaW5hbCA8LSAgZmlsdGVyKENyaXN0YXR1c19FTUEsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpDQoNCg0KdW5ncm91cChDcmlzdGF0dXNfRU1BX0ZpbmFsKQ0KDQoNCiNOb3cgY29tYmluZSBFTUEgYW5kIEVjb0RBQVQgZGF0YSB0b2dldGhlcg0KDQpDcmlzdGF0dXNfRmluYWwgPC0gcmJpbmQoQ3Jpc3RhdHVzX0VNQV9GaW5hbCwgQ3Jpc3RhdHVzX0Vjb0RBQVRfRmluYWwpDQoNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENyaXN0YXR1c19GaW5hbCkNCg0KDQpgYGANCg0KDQpOZW9jYWxhbnVzIHNwcC4NCg0KYGBge3J9DQoNCk5lb2NhbGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTmVvY2FsYW51cyBzcHAuIikNCg0KDQojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzDQoNCk5lb2NhbGFudXNfRU1BIDwtIGZpbHRlcihOZW9jYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVNQSIpDQpOZW9jYWxhbnVzX0Vjb0RBQVQgPC0gZmlsdGVyKE5lb2NhbGFudXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpDQoNCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhDQoNCk5lb2NhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpDQoNCk5lb2NhbGFudXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoTmVvY2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpDQoNCiNEbyBzb21lIGZpbHRlcmluZyB0byBnZXQgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgZ2VhciBmb3IgRWNvREFBVCBkYXRhDQoNCk5lb2NhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJCIikNCk5lb2NhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVRfQiwgTUVTSCE9MTUzKQ0KDQpOZW9jYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpDQpOZW9jYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFUX0MsIE1FU0g9PTE1MykNCk5lb2NhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVRfQywgR0VBUl9OQU1FPT0iMjBCT04iKQ0KDQpOZW9jYWxhbnVzX0Vjb0RBQVRfRyA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRyIpDQoNCk5lb2NhbGFudXNfRWNvREFBVF9IIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJIIikNCg0KTmVvY2FsYW51c19FY29EQUFUX0sgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IksiKQ0KDQpOZW9jYWxhbnVzX0Vjb0RBQVRfTCA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iTCIpDQoNCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldA0KDQpOZW9jYWxhbnVzX0Vjb0RBQVRfRmluYWwgPC0gcmJpbmQoTmVvY2FsYW51c19FY29EQUFUX0IsIE5lb2NhbGFudXNfRWNvREFBVF9DLCBOZW9jYWxhbnVzX0Vjb0RBQVRfRywgTmVvY2FsYW51c19FY29EQUFUX0gsIE5lb2NhbGFudXNfRWNvREFBVF9LLCBOZW9jYWxhbnVzX0Vjb0RBQVRfTCkNCg0KdW5ncm91cChOZW9jYWxhbnVzX0Vjb0RBQVRfRmluYWwpDQoNCiNSZW1vdmUgc29tZSBmaWxlcw0KDQpybShOZW9jYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBOZW9jYWxhbnVzX0Vjb0RBQVRfQiwgTmVvY2FsYW51c19FY29EQUFUX0MsIE5lb2NhbGFudXNfRWNvREFBVF9HLCBOZW9jYWxhbnVzX0Vjb0RBQVRfSCwgTmVvY2FsYW51c19FY29EQUFUX0ssIE5lb2NhbGFudXNfRWNvREFBVF9MKQ0KDQojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzDQoNCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGENCg0KTmVvY2FsYW51c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoTmVvY2FsYW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkNCg0KTmVvY2FsYW51c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKE5lb2NhbGFudXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpDQoNCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMNCg0KTmVvY2FsYW51c19FTUFfRmluYWwgPC0gIGZpbHRlcihOZW9jYWxhbnVzX0VNQSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikNCg0KDQp1bmdyb3VwKE5lb2NhbGFudXNfRU1BX0ZpbmFsKQ0KDQoNCiNOT3cgY29tYmluZSBFTUEgYW5kIEVjb0RBQVQgZGF0YSB0b2dldGhlcg0KDQpOZW9jYWxhbnVzX0ZpbmFsIDwtIHJiaW5kKE5lb2NhbGFudXNfRU1BX0ZpbmFsLCBOZW9jYWxhbnVzX0Vjb0RBQVRfRmluYWwpDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIE5lb2NhbGFudXNfRmluYWwpDQoNCg0KYGBgDQoNCg0KT2l0aG9uYSBzcHAuDQoNCmBgYHtyfQ0KDQpPaXRob25hIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik9pdGhvbmEgc3BwLiIpDQoNCiNGaWx0ZXIgZm9yIHNtYWxsIG5ldHMgb25seQ0KDQpPaXRob25hIDwtIGZpbHRlcihPaXRob25hLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgT2l0aG9uYSkNCg0KDQpgYGANCg0KT3N0cmFjb2RhDQoNCg0KYGBge3J9DQoNCk9zdHJhY29kYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJPc3RyYWNvZGEiKQ0KDQoNCg0KYGBgDQoNCg0KUG9seWNoYWV0YQ0KDQpgYGB7cn0NCg0KUG9seWNoYWV0YSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJQb2x5Y2hhZXRhIikNCg0KI1NwbGl0IGludG8gc21hbGwgYW5kIGxhcmdlIGVzdGltYXRlcyBmcm9tIHRoZSBjb3JyZWN0IG5ldHMgYW5kIG1lc2hlcw0KDQpQb2x5Y2hhZXRhX2xhcmdlIDwtIGZpbHRlcihQb2x5Y2hhZXRhLCBHRUFSX05BTUU9PSI2MEJPTiIpDQoNCg0KI1JlbmFtZSBQb2x5Y2hhZXRhIGxhcmdlDQoNClBvbHljaGFldGFfbGFyZ2UkVEFYQV9DT0FSU0VbUG9seWNoYWV0YV9sYXJnZSRUQVhBX0NPQVJTRT09IlBvbHljaGFldGEiXSA8LSAiUG9seWNoYWV0YV9sYXJnZSINCg0KDQojTm93IGRvIHRoZSBzbWFsbCBuZXRzDQoNClBvbHljaGFldGFfc21hbGwgPC0gZmlsdGVyKFBvbHljaGFldGEsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KI1JlbmFtZSBQb2x5Y2hhZXRhIHNtYWxsDQoNClBvbHljaGFldGFfc21hbGwkVEFYQV9DT0FSU0VbUG9seWNoYWV0YV9zbWFsbCRUQVhBX0NPQVJTRT09IlBvbHljaGFldGEiXSA8LSAiUG9seWNoYWV0YV9zbWFsbCINCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBQb2x5Y2hhZXRhX2xhcmdlLCBQb2x5Y2hhZXRhX3NtYWxsKQ0KDQoNCg0KYGBgDQoNCg0KUHNldWRvY2FsYW51cw0KDQpgYGB7cn0NCg0KUHNldWRvY2FsYW51cyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJQc2V1ZG9jYWxhbnVzIHNwcC4iKQ0KDQojRmlsdGVyIGZvciB0aGUgc21hbGwgbmV0cyBvbmx5DQoNClBzZXVkb2NhbGFudXMgPC0gZmlsdGVyKFBzZXVkb2NhbGFudXMsIEdFQVJfTkFNRSE9IjYwQk9OIikNCg0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBQc2V1ZG9jYWxhbnVzKQ0KDQoNCmBgYA0KDQoNClRoYWxpYWNlYQ0KDQpgYGB7cn0NCg0KVGhhbGlhY2VhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlRoYWxpYWNlYSIpDQoNCmBgYA0KDQoNClRoZW1pc3RvIGFieXNzb3J1bQ0KDQpgYGB7cn0NCg0KVGhlbWlzdG9fYWJ5c3NvcnVtIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlRoZW1pc3RvIGFieXNzb3J1bSIpDQoNCmBgYA0KDQoNClRoZW1pc3RvIGxpYmVsbHVsYQ0KDQpgYGB7cn0NCg0KVGhlbWlzdG9fbGliZWxsdWxhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlRoZW1pc3RvIGxpYmVsbHVsYSIpDQoNCiNGaWx0ZXIgZm9yIHRoZSA2MEJPTiBuZXRzIG9ubHkNCg0KVGhlbWlzdG9fbGliZWxsdWxhIDwtIGZpbHRlcihUaGVtaXN0b19saWJlbGx1bGEsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRoZW1pc3RvX2xpYmVsbHVsYSkNCg0KYGBgDQoNCg0KVGhlbWlzdG8gcGFjaWZpY2ENCg0KYGBge3J9DQoNClRoZW1pc3RvX3BhY2lmaWNhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlRoZW1pc3RvIHBhY2lmaWNhIikNCg0KI0ZpbHRlciBmb3IgdGhlIDYwQk9OIG5ldHMgb25seQ0KDQpUaGVtaXN0b19wYWNpZmljYSA8LSBmaWx0ZXIoVGhlbWlzdG9fcGFjaWZpY2EsIEdFQVJfTkFNRT09IjYwQk9OIikNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRoZW1pc3RvX3BhY2lmaWNhKQ0KDQoNCmBgYA0KDQpUaGVtaXN0byBzcHAuDQoNCmBgYHtyfQ0KDQpUaGVtaXN0byA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJUaGVtaXN0byBzcHAuIikNCg0KI0ZpbHRlciBmb3IgdGhlIDYwQk9OIG5ldHMgb25seQ0KDQpUaGVtaXN0bzwtIGZpbHRlcihUaGVtaXN0bywgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQojQWRkIHRvIGZpbmFsIGRhdGFzZXQNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgVGhlbWlzdG8pDQoNCg0KYGBgDQoNCg0KVGh5c2Fub2Vzc2Egc3BlY2llcw0KDQpgYGB7cn0NCg0KVGh5c2Fub2Vzc2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgaW5lcm1pcyJ8VEFYQV9DT0FSU0U9PSJUaHlzYW5vZXNzYSBpbnNwaW5hdGEifFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgbG9uZ2lwZXMifFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgcmFzY2hpaSJ8VEFYQV9DT0FSU0U9PSJUaHlzYW5vZXNzYSBzcGluaWZlcmEiKQ0KDQojU2VsZWN0IGZvciA2MEJPTiBvbmx5DQoNClRoeXNhbm9lc3NhIDwtIGZpbHRlcihUaHlzYW5vZXNzYSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQojTm93IHRoZSBjb3JyZWN0IHN0YWdlcw0KDQpUaHlzYW5vZXNzYSA8LSBmaWx0ZXIoVGh5c2Fub2Vzc2EsIFNUQUdFX05BTUU9PSJBICsgSiAoQURVTFQvSlVWRU5JTEUpInxTVEFHRV9OQU1FPT0iSlVWRU5JTEUifFNUQUdFX05BTUU9PSJBRFVMVCIpDQoNCiNBZGQgdG8gZmluYWwgZGF0YXNldA0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBUaHlzYW5vZXNzYSkNCg0KYGBgDQoNCg0KVG9ydGFudXMgZGlzY2F1ZGF0dXMNCg0KDQpgYGB7cn0NCg0KVG9ydGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVG9ydGFudXMgZGlzY2F1ZGF0dXMiKQ0KDQojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzDQoNClRvcnRhbnVzX0VNQSA8LSBmaWx0ZXIoVG9ydGFudXMsIERBVEFfU09VUkNFPT0iRU1BIikNClRvcnRhbnVzX0Vjb0RBQVQgPC0gZmlsdGVyKFRvcnRhbnVzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQ0KDQojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQ0KDQpUb3J0YW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShUb3J0YW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpDQoNClRvcnRhbnVzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKFRvcnRhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkNCg0KI0Vjb0RBQVQgZGF0YSBhcmUgY29ycmVjdGx5IHNwZWNpZmllZA0KDQoNCg0KI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcw0KDQojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhDQoNClRvcnRhbnVzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShUb3J0YW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkNCg0KVG9ydGFudXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShUb3J0YW51c19FTUFfYnlHRUFSX05BTUUsIG4oKSkNCg0KI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cw0KDQpUb3J0YW51c19FTUFfNjBCT04gPC0gZmlsdGVyKFRvcnRhbnVzX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQ0KDQpUb3J0YW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihUb3J0YW51c19FTUFfNjBCT04sIE1FU0g9PTMzMykNCg0KVG9ydGFudXNfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BXzYwQk9OXzMzMywgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikiKQ0KDQpUb3J0YW51c19FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihUb3J0YW51c19FTUFfNjBCT04sIE1FU0g9PTUwNSkNCg0KVG9ydGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BXzYwQk9OXzUwNSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikiKQ0KDQoNCg0KVG9ydGFudXNfRU1BX3NtYWxsbmV0cyA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BLCBHRUFSX05BTUUhPSI2MEJPTiIpDQoNCg0KVG9ydGFudXNfRU1BX3NtYWxsbmV0cyA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BX3NtYWxsbmV0cywgU1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkifFNUQUdFX05BTUU9PSJDIC0gMiAoQ09QRVBPRElURSBJSSkifFNUQUdFX05BTUU9PSJDIC0gMSAoQ09QRVBPRElURSBJKSIpDQoNCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldA0KDQpUb3J0YW51c19FTUFfRmluYWwgPC0gcmJpbmQoVG9ydGFudXNfRU1BXzYwQk9OXzMzMywgVG9ydGFudXNfRU1BXzYwQk9OXzUwNSwgVG9ydGFudXNfRU1BX3NtYWxsbmV0cykNCg0KdW5ncm91cChUb3J0YW51c19FTUFfRmluYWwpDQoNCiNSZW1vdmUgc29tZSBmaWxlcw0KDQpybShUb3J0YW51c19FTUFfYnlHRUFSX05BTUUsICBUb3J0YW51c19FTUFfc21hbGxuZXRzLCBUb3J0YW51c19FTUFfNjBCT04sIFRvcnRhbnVzX0VNQV82MEJPTl8zMzMsIFRvcnRhbnVzX0VNQV82MEJPTl81MDUpDQoNCiNDb21iaW5lIGludG8gZmluYWwsIFRvcnRhbnVzIGRhdGEgc2V0DQoNClRvcnRhbnVzIDwtIHJiaW5kKFRvcnRhbnVzX0VNQV9GaW5hbCwgVG9ydGFudXNfRWNvREFBVCkNCg0KI0FkZCB0byBmaW5hbCBkYXRhc2V0DQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRvcnRhbnVzKQ0KDQoNCmBgYA0KTm93IGRvIGJpb21hc3MgY29udmVyc2lvbnMNCg0KDQpgYGB7cn0NCg0KI05PdyByZWFkIGluIHRoZSBiaW9tYXNzIGNvbnZlcnNpb24gZGF0YSBzZXQNCg0KQmlvbWFzc19hbm5vdGF0ZWQgPC0gcmVhZF94bHN4KGhlcmUoIkJpb21hc3MiLCAiQmlvbWFzcy1Bbm5vdGF0ZWQueGxzeCIpKQ0KDQojTWVyZ2UgdGhlIHR3byBkYXRhIHNldHMgYmFzZWQgb24gVEFYQV9DT0FSU0UsIFNUQUdFX05BTUUsIFNFWF9OQU1FDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbGVmdF9qb2luKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJpb21hc3NfYW5ub3RhdGVkLCBieSA9IGMoIlRBWEFfQ09BUlNFIiwgIlNUQUdFX05BTUUiLCAiU0VYX05BTUUiKSkNCg0KI0RvIHNvbWUgdGlkeWluZyB0byBlbGltaW5hdGUgc29tZSBjb2x1bW5zDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwkTk9URSA8LSBOVUxMDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsJElORF9XV19NR19OT1RFIDwtIE5VTEwNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwkSU5EX0RXX01HX0NPTlZFUlRFRF9OT1RFIDwtIE5VTEwNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwkSU5EX0NfTUdfQ09OVkVSVEVEX05PVEUgPC0gTlVMTA0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCRHUk9XVEhfUkFURV9OT1RFIDwtIE5VTEwNCg0KDQojQ3JlYXRlIHdldCB3ZWlnaHQgYmlvbWFzcyBjb2x1bW4gY29udmVydGVkIGluZGl2aWR1YWwgd2V0IHdlaWdodCBhbmQgYWJ1bmRhbmNlDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfV1dfTUdfTTNfTUVBTiA9IElORF9XV19NR19NRUFTVVJFRF9NRUFOKkVTVF9OVU1fUEVSTTMpDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfV1dfTUdfTTNfU0QgPSBJTkRfV1dfTUdfTUVBU1VSRURfU0QqRVNUX05VTV9QRVJNMykNCg0KDQojQ3JlYXRlIGRyeSB3ZWlnaHQgYmlvbWFzcyBjb2x1bW4gY29udmVydGVkIGluZGl2aWR1YWwgZHJ5IHdlaWdodCBhbmQgYWJ1bmRhbmNlDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfRFdfTUdfTTNfTUVBTiA9IElORF9EV19NR19DT05WRVJURURfTUVBTipFU1RfTlVNX1BFUk0zKQ0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCSU9NQVNTX0RXX01HX00zX1NEID0gSU5EX0RXX01HX0NPTlZFUlRFRF9TRCpFU1RfTlVNX1BFUk0zKQ0KDQoNCiNDcmVhdGUgY2FyYm9uIHdlaWdodCBiaW9tYXNzIGNvbHVtbiBjb252ZXJ0ZWQgaW5kaXZpZHVhbCBjYXJib24gd2VpZ2h0IGFuZCBhYnVuZGFuY2UNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBtdXRhdGUoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQklPTUFTU19DX01HX00zX01FQU4gPSBJTkRfQ19NR19DT05WRVJURURfTUVBTipFU1RfTlVNX1BFUk0zKQ0KDQpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIG11dGF0ZShOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCSU9NQVNTX0NfTUdfTTNfU0QgPSBJTkRfQ19NR19DT05WRVJURURfU0QqRVNUX05VTV9QRVJNMykNCg0KDQojQ3JlYXRlIGNhcmJvbiB3ZWlnaHQgYmlvbWFzcyBjb2x1bW4gY29udmVydGVkIGluZGl2aWR1YWwgY2FyYm9uIHdlaWdodCBhbmQgYWJ1bmRhbmNlDQoNCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFBST0RVQ1RJT05fTUdfQ19EX01FQU4gPSAoSU5EX0NfTUdfQ09OVkVSVEVEX01FQU4qRVNUX05VTV9QRVJNMypHUk9XVEhfUkFURV9NRUFOKSoyNCkNCg0KTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBtdXRhdGUoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgUFJPRFVDVElPTl9NR19DX0RfU0QgPSAoSU5EX0NfTUdfQ09OVkVSVEVEX1NEKkVTVF9OVU1fUEVSTTMqR1JPV1RIX1JBVEVfU0QpKjI0KQ0KDQoNCmBgYA0KDQoNCk5vdyB3cml0ZSBwcm9jZXNzZWQgZGF0YXNldCBhZnRlciBhZGRpbmcgYmlvbWFzcyBpbmZvcm1hdGlvbg0KDQpgYGB7cn0NCg0KDQp3cml0ZS5jc3YoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgaGVyZSgiUHJvY2Vzc2VkLURhdGEiLCAiTkJTX1pvb3BfUHJvY2Vzc19GaW5hbC5jc3YiKSwgcm93Lm5hbWVzID0gRkFMU0UpDQoNCmBgYA0KDQoNCg==